R 替换na和x27;从另一个df获取值

R 替换na和x27;从另一个df获取值,r,dplyr,na,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

我在下面有两个数据帧,第一个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  
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)]%
分组依据(区间)%>%
mutate(steps=rep(df2$avg.steps[df2$interval==interval[1]],length(interval)))$steps

以下是我如何使用
数据表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
的每一行,我们在
dt2
中找到相应的匹配行,同时在“interval”列中加入

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

希望这有帮助



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

它们不对应,df2只有288个条目,因为它只是df1I的每个间隔的平均值。我尝试了上述方法,得到了以下错误:
集合中的错误(I,j=lc,value=newfactor):.SD被锁定。使用:=或set通过引用更新.SD保留供将来使用。直接在j中使用:=。或者使用copy(.SD)作为(缓慢的)最后手段,直到shallow()被导出。
我花了一些时间研究这个问题,并了解了更多关于data.tables的信息,但无法在当前的开发中解决它。现在使用
copy(.SD)
require(data.table) # v1.9.6+, for 'on=' feature
dt1[is.na(steps), steps := dt2[.SD, avg.steps, on="interval"]]