我的问题类似于one。假设我有两个数据帧,如下所示:
df1
val2
在val3
和date
列中有一些缺失值。我想仅使用正确匹配替换这些列中的缺失值,并根据df2
中的data.table
进行匹配。从我链接到的问题,这是使用library(data.table)
setDT(df1)
setDT(df2)
df1[i = df2, val2 := i.val2, on = .(date)]
df1
date val1 val2 val3
1: 2001-01-01 -0.84085548 -0.6029080 -0.2857736
2: 2001-02-01 1.38435934 -0.4721664 0.1381082
3: 2001-03-01 -1.25549186 -0.8017795 1.2276303
4: 2001-04-01 0.07014277 -1.0803926 NA
5: 2001-05-01 1.71144087 -0.1575344 NA
的潜在解决方案:
val2
这里的问题是它已将df1
中df2
的第3个值替换为df1
中的匹配值,即使df1
中的第3个值不是最初失踪。另外,如何使用df2
中的匹配值填充Azure WebJobs Dashboard
中的所有缺失值,而不是一次填充一列?
答案 0 :(得分:0)
以下是使用dplyr
包的一种解决方案:
df1 <- df1 %>%
left_join(., df2, by = 'date') %>%
mutate(
val2 = ifelse(is.na(val2.x), val2.y, val2.x),
val3 = ifelse(is.na(val3.x), val3.y, val3.x)
) %>%
select(date, val1, val2, val3)
df1
date val1 val2 val3
1 2001-01-01 -0.84085548 -0.6029080 -0.2857736
2 2001-02-01 1.38435934 -0.4721664 0.1381082
3 2001-03-01 -1.25549186 -0.6353713 1.2276303
4 2001-04-01 0.07014277 -1.0803926 -0.1389861
5 2001-05-01 1.71144087 -0.1575344 -0.5973131
最后用种子集。该死的,我一直得到不同的结果! :)
正确指出coalesce
选项:
df1 %>%
left_join(., df2, by = 'date') %>%
mutate(
val2 = coalesce(val2.x, val2.y),
val3 = coalesce(val3.x, val3.y)
) %>%
select(date, val1, val2, val3)
肯定比ifelse
清洁。