R 替换na和x27;从另一个df获取值
我在下面有两个数据帧,第一个df有~15k个按时间和日期记录的步数,第二个df是每个间隔时间的平均步数。我想做的是通过df1,用df2中的avg.steps值替换na值,但是我似乎无法计算出R。什么是最有效的方法?有没有一种方法可以用dplyr来实现呢 df1如下所示: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
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"]]