r - 用组内相同的值填充缺失值(将已知的 IMEI 与缺失的手机型号匹配)

标签 r dplyr

我有一个时间序列/面板数据,包括加密的 IMEI(每个手机唯一但不是每个用户唯一)和手机品牌。 IMEI 中没有太多缺失值,但手机品牌中存在大量缺失值。由于唯一的 IMEI 对应于唯一的手机,我们可以通过 IMEI 推断缺失的品牌。 我的解决方案是构建一个 IMEI 品牌表,并 merge(by=IMEI) 与我当前的数据。 我只是好奇。还有其他方法吗?例如,在 dplyr 或 data.table 中,或者只是 r-base 函数。我的数据很大,大约有 300 万个观察值。

注意:一个用户可以有多个设备/IMEI;品牌缺少一些时间,无论是在开始时间、中间时间还是结束时间。

# create sample data
user<-rep(letters[1:5],each=6)
time<-rep(1:6,5)
imei<-c(rep(100,6),rep(200,4),NA,201,rep(300,6),rep(400,3),401,404,404,rep(500,5),NA)
brand<-c(rep('Apple',3),NA,NA,'Apple',NA,rep('ZTE',4),NA,NA,NA,NA,rep('Samsung',3),NA,'Huawei',NA,'Nokia','HTC',NA,rep('Moto',6))
dt<-data.frame(time,user,imei,brand)

    #data
  time user imei   brand
1     1    a  100   Apple
2     2    a  100   Apple
3     3    a  100   Apple
4     4    a  100    <NA>
5     5    a  100    <NA>
6     6    a  100   Apple
7     1    b  200    <NA>
8     2    b  200     ZTE
9     3    b  200     ZTE
10    4    b  200     ZTE
11    5    b   NA     ZTE
12    6    b  201    <NA>
13    1    c  300    <NA>
14    2    c  300    <NA>
15    3    c  300    <NA>
16    4    c  300 Samsung
17    5    c  300 Samsung
18    6    c  300 Samsung
19    1    d  400    <NA>
20    2    d  400  Huawei
21    3    d  400    <NA>
22    4    d  401   Nokia
23    5    d  404     HTC
24    6    d  404    <NA>
25    1    e  500    Moto
26    2    e  500    Moto
27    3    e  500    Moto
28    4    e  500    Moto
29    5    e  500    Moto
30    6    e   NA    Moto

最佳答案

这是一个 data.table 方法:

library(data.table)
setDT(dt)
setkey(dt, imei)
dt[dt, brand := unique(na.omit(brand)), imei]
#     time user imei   brand
#  1:    5    b   NA     ZTE
#  2:    6    e   NA    Moto
#  3:    1    a  100   Apple
#  4:    2    a  100   Apple
#  5:    3    a  100   Apple
#  6:    4    a  100   Apple
#  7:    5    a  100   Apple
#  8:    6    a  100   Apple
#  9:    1    b  200     ZTE
# 10:    2    b  200     ZTE
# 11:    3    b  200     ZTE
# 12:    4    b  200     ZTE
# 13:    6    b  201      NA
# 14:    1    c  300 Samsung
# 15:    2    c  300 Samsung
# 16:    3    c  300 Samsung
# 17:    4    c  300 Samsung
# 18:    5    c  300 Samsung
# 19:    6    c  300 Samsung
# 20:    1    d  400  Huawei
# 21:    2    d  400  Huawei
# 22:    3    d  400  Huawei
# 23:    4    d  401   Nokia
# 24:    5    d  404     HTC
# 25:    6    d  404     HTC
# 26:    1    e  500    Moto
# 27:    2    e  500    Moto
# 28:    3    e  500    Moto
# 29:    4    e  500    Moto
# 30:    5    e  500    Moto
#     time user imei   brand

这是一个 dplyr + zoo::na.locf 方法:

library(dplyr)
library(zoo)
fillna <- function(x) na.locf(na.locf(x, na.rm = FALSE), fromLast = TRUE, na.rm = FALSE)
dt <- dt %>% group_by(imei) %>% mutate(brand = fillna(brand))

关于r - 用组内相同的值填充缺失值(将已知的 IMEI 与缺失的手机型号匹配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39650557/

相关文章:

r - 给定类型 min_date 和 max_date 的聚合 ID 随时间变化

r - geom_bar(position = "dodge") 中条的宽度相同

r - R-Lehmann Primality Test 中的模数警告

r - 通过整数向量进行矩阵索引

r - 有没有办法在 mutate 中使用 `dplyr` select helper 函数?

r - 基于列汇总变量的更快方法

r - 使用 ggplot2/Rstudio 进行缓慢的图形渲染 - GPU 问题?

r - dplyr 返回每个组的全局平均值,而不是每个组的平均值

r - 忽略 dplyr 连接中的区分大小写

r - 为什么 dplyr 删除了不满足条件的值?