如何用2列填充NA

时间:2019-09-12 20:31:13

标签: r dataframe

我想将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。

2 个答案:

答案 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

它:

  1. 将数据框设置为仅允许na
  2. 基于交通运输的non_NA,自我与唯一的mode值联接。
  3. 确定哪个是最小距离。

数据:

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