我在下面有两个数据框,第一个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

最佳答案

这是我使用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。这是通过执行联接作为子集来完成的。 .SD指数据的子集,即dt1$steps等于NA的那些行。

对于stepsNA的每一行,我们在加入“interval”列时在dt2中找到了相应的匹配行。

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

希望这可以帮助。

如果dt2的任何dt1$interval值都具有多个匹配项,则必须决定更新哪个值。但是我猜这里不是这样。

关于r - 用另一个df的值替换na,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33072348/

10-12 16:29