用另一个 df 的值替换 na

Replace na's with value from another df

我下面有两个数据框,第一个 df 有大约 15k 步数的时间和日期记录,第二个 df 是每个间隔时间的平均步数。我想做的是通过 df1 并将 na 值替换为 df2 中的 avg.steps 值,但是我似乎无法弄清楚 R。最有效的方法是什么这个?有没有办法使用 dplyr 来做到这一点?

df1 看起来像这样:

steps <- c(51, 516, NA, NA, 161, 7)
interval <- c(915, 920, 925, 930, 935, 940)

steps  interval
   51       915
  516       920
   NA       925
   NA       930
  161       935
    7       940  

df2 看起来像这样:

avg.steps <- c(51, 516, 245, 0, 161, 7)
interval <- c(915, 920, 925, 930, 935, 940)

avg.steps  interval
       51       915
      516       920
      245       925
        0       930
      161       935
        7       940  

只要词条对应就很简单了
df1$steps[is.na(df1$steps)] <- df2$avg.steps[is.na(df1$steps)]

编辑: 如果它们不对应,那么这里有一个 dplyr 解决方案:

library(dplyr)

df1$steps[is.na(steps)] <- (df1 %>% filter(is.na(steps)) %>% 
    group_by(interval) %>% 
    mutate(steps = rep(df2$avg.steps[df2$interval == interval[1]], length(interval)))$steps

以下是我使用 data.table v1.9.6 的方法:

require(data.table) # v1.9.6+, for 'on=' feature
dt1[is.na(steps), steps := dt2[.SD, avg.steps, on="interval"]]

第一个参数 i = is.na(steps) 允许我们只查看 dt1$stepsNA 的那些行。 在那些行上,我们更新 dt1$steps。这是通过执行 join as subset 来完成的。 .SD 指数据 的 子集,即 dt1$steps 等于 NA 的那些行。

对于 stepsNA 的每一行,我们在加入 on 时在 dt2 中找到对应的匹配行 "interval"栏目。

例如,is.na(steps) 会将 dt1 中的 return 第 3 行作为行之一。查找 .SD$interval = 925dt2$interval 的匹配行将 return 索引“3”(dt2 中的第 3 行)。对应的avg.steps值为“245”。因此 dt1 的第 3 行更新为 245.

希望这对您有所帮助。


如果 dt2 对任何 dt1$interval 值有多个匹配项,您必须决定更新哪个值。但我猜这里不是这种情况。