我有两个数据帧,第一个df有~15k的时间和日期步数记录,第二个df是每个间隔时间的平均步数。我试图做的是通过df1并用来自df2的avg.steps值替换na值,但是我似乎无法弄清楚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
答案 0 :(得分:4)
以下是我使用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
。这是通过执行 join作为子集来完成的。 .SD
指的是数据子集,即dt1$steps
等于NA
的那些行。
对于steps
为NA
的每一行,我们在加入 &#34; interval&#34;时dt2
找到相应的匹配行列。
例如,is.na(steps)
将返回dt1
中的第3行作为其中一行。查找.SD$interval = 925
与dt2$interval
的匹配行将返回索引&#34; 3&#34; (dt2
中的第3行)。相应的avg.steps
值为&#34; 245&#34;。因此dt1
的第3行会更新为245
。
希望这有帮助。
如果dt2
对任何dt1$interval
值都有多个匹配项,那么您必须决定要更新哪个值。但我猜这不是这种情况。
答案 1 :(得分:2)
只要条目相应,它就非常简单
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