我在下面有两个数据框,第一个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$steps
为NA
的那些行。在这些行上,我们更新dt1$steps
。这是通过执行联接作为子集来完成的。 .SD
指数据的子集,即dt1$steps
等于NA
的那些行。对于
steps
是NA
的每一行,我们在加入“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/