用另一个 df 的值替换 na
Replace na's with value from another df
我下面有两个数据框,第一个 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
只要词条对应就很简单了
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
以下是我使用 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 as subset 来完成的。 .SD
指数据 的 子集,即 dt1$steps
等于 NA
的那些行。
对于 steps
为 NA
的每一行,我们在加入 on 时在 dt2
中找到对应的匹配行 "interval"栏目。
例如,is.na(steps)
会将 dt1
中的 return 第 3 行作为行之一。查找 .SD$interval = 925
与 dt2$interval
的匹配行将 return 索引“3”(dt2
中的第 3 行)。对应的avg.steps
值为“245”。因此 dt1
的第 3 行更新为 245
.
希望这对您有所帮助。
如果 dt2
对任何 dt1$interval
值有多个匹配项,您必须决定更新哪个值。但我猜这里不是这种情况。
我下面有两个数据框,第一个 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
只要词条对应就很简单了
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
以下是我使用 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 as subset 来完成的。 .SD
指数据 的 子集,即 dt1$steps
等于 NA
的那些行。
对于 steps
为 NA
的每一行,我们在加入 on 时在 dt2
中找到对应的匹配行 "interval"栏目。
例如,is.na(steps)
会将 dt1
中的 return 第 3 行作为行之一。查找 .SD$interval = 925
与 dt2$interval
的匹配行将 return 索引“3”(dt2
中的第 3 行)。对应的avg.steps
值为“245”。因此 dt1
的第 3 行更新为 245
.
希望这对您有所帮助。
如果 dt2
对任何 dt1$interval
值有多个匹配项,您必须决定更新哪个值。但我猜这里不是这种情况。