我有一个时间序列/面板数据,包括加密的 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/