我想将NA值填充到我的数据集中。我不确定是否可以执行以下操作:
我有3列,我想填写NA的距离
duration distance mode
15 7 car
20 6 walk
13 NA car
20 8 car
18 NA walk
30 10 walk
对于每种模式,我想找到最接近的持续时间并输入NA作为距离
对于有模汽车,最接近的持续时间是15,因此第一个NA为7,对于第二个NA(即步行模式),最接近的持续时间是20,因此NA为6。
答案 0 :(得分:2)
这是一个data.table
解决方案:
library(data.table)
dt[is.na(distance),
distance := {dt[!is.na(distance)
][.SD,
on = .(mode),
distance[which.min(abs(duration - i.duration))],
by = .EACHI]$V1
}
]
dt
# duration distance mode
#1: 15 7 car
#2: 20 6 walk
#3: 13 7 car
#4: 20 8 car
#5: 18 6 walk
#6: 30 10 walk
#7: 35 10 walk
它:
na
值non_NA
,自我与唯一的mode
值联接。数据:
library(data.table)
DT <- fread('duration distance mode
15 7 car
20 6 walk
13 NA car
20 8 car
18 NA walk
30 10 walk
35 NA walk')
答案 1 :(得分:2)
基数R中的一种方法可以是分隔NA
和非NA组。对于NA_group
中的每个值,我们在同一duration
中的non_NA_group
中找到最接近的mode
,然后返回相应的distance
。
NA_group <- subset(df, is.na(distance))
non_NA_group <- subset(df, !is.na(distance))
df$distance[is.na(df$distance)] <- mapply(function(x, y) {
temp <- subset(non_NA_group, mode == y)
temp$distance[which.min(abs(x - temp$duration))]
} ,NA_group$duration, NA_group$mode)
df
# duration distance mode
#1 15 7 car
#2 20 6 walk
#3 13 7 car
#4 20 8 car
#5 18 6 walk
#6 30 10 walk