用另一个df的值替换na

时间:2015-10-12 02:24:03

标签: r dplyr na

我有两个数据帧,第一个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  

2 个答案:

答案 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$stepsNA的行。 在这些行上,我们更新 dt1$steps。这是通过执行 join作为子集来完成的。 .SD指的是数据子集,即dt1$steps等于NA的那些行。

对于stepsNA的每一行,我们在加入 &#34; interval&#34;时dt2找到相应的匹配行列。

例如,is.na(steps)将返回dt1中的第3行作为其中一行。查找.SD$interval = 925dt2$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
相关问题