用id替换另一个数据框中的NA值

6

我有一个如下的数据框 df1 -

ID Count 
11  345
22  456
33  786
44  765
55  NA
66  888
77  NA

然后我有一个如下的df2 -
 ID  Count 
 11  536
 22  654
 33  786
 44  999
 55  890
 66  111
 77  654

我希望将 df1 中的 NA 值替换为来自 df2 的特定 id 值。

最终的 df3 应该是:

ID  Count 
11  345
22  456
33  786
44  765
55  890
66  888
77  654

Any help will be great Thanks

3个回答

5
使用dplyr::coalesce函数可以使任务更简单。
library(dplyr)

df1 %>% inner_join(df2, by= "ID") %>%
  mutate(Count = coalesce(Count.x, Count.y)) %>%
  select(ID, Count)

#   ID Count
# 1 11   345
# 2 22   456
# 3 33   786
# 4 44   765
# 5 55   890
# 6 66   888
# 7 77   654

数据:

df1 <- read.table(text = 
"ID Count 
11  345
22  456
33  786
44  765
55  NA
66  888
77  NA",
header = TRUE)

df2 <- read.table(text = 
"ID  Count 
11  536
22  654
33  786
44  999
55  890
66  111
77  654",
header = TRUE)

1
您可以使用更新连接来编辑第一个表中的这些行:
library(data.table)
setDT(DF1); setDT(DF2)

DF1[is.na(Count), Count := DF2[.SD, on=.(ID), x.Count]]

它是如何工作的

  • DF [i,j]i 过滤,然后执行 j
  • 因此,在 j 中,.SD 指的是使用 i 过滤后的数据子集
  • 带有 :=j 在表格中添加或修改列
  • x[i,on=,x.v]在这个类似的答案中描述的那样

0
使用 dplyr
library(dplyr)

df1 %>%
  left_join(df2, by = c("ID")) %>%
  mutate(Count = ifelse(is.na(Count.x), Count.y, Count.x)) %>%
  select(-c(Count.x, Count.y))

这将产生

  ID Count
1 11   345
2 22   456
3 33   786
4 44   765
5 55   890
6 66   888
7 77   654

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接