合并两个数据框并在R中替换NA值。

7

我有一个主表(a),包含列: id, age 和 sex。例如:

a <- data.frame(id=letters[1:4], age=c(18,NA,9,NA), sex=c("M","F","F","M"))
  id age sex
1  a  18   M
2  b  NA   F
3  c   9   F
4  d  NA   M

我有一个补充表(b),只包含在表(a)中缺失的数据或重复的数据。例如:

b <- data.frame(id=c("a","b","d"), age=c(18,32,20))
  id age
1  a  18
2  b  32
3  d  20

现在我想将这两个表合并成以下这样:
  id age sex
1  a  18   M
2  b  32   F
3  c   9   F
4  d  20   M

然而,我尝试了 merge(a,b,by="id",all=T)。结果并不是我想要的。是否有任何方法可以解决这个问题?谢谢!

2个回答

4
我们可以使用data.table
library(data.table)
setDT(a)[b, agei := i.age, on='id'][is.na(age), age := agei][,agei:= NULL][]
a
 #  id age sex
#1:  a  18   M
#2:  b  32   F
#3:  c   9   F
#4:  d  20   M

akrun,我最近发布了一个问题,关于如何使用第二个数据表(在此示例中为b)中的所有列来完成仅更新NA值的操作。在OP的情况下,它只涉及年龄列。你愿意在这篇文章或我的文章中尝试解决这个问题吗?我喜欢data.table的解决方案。 - AlexR
@AlexR 看起来Frank提供了一些解决方案。 - akrun
他确实做到了,但解决方案涉及融合数据,这会强制所有变量转换为相同的类型。我希望有一些不那么“侵入式”的东西,并期待着各种意见。无论如何,感谢您的查看。 - AlexR

2

Here is a dplyr solution:

library(dplyr)

c <- left_join(a,b, by = "id") %>% # this will generate age.x and age.y
  mutate(age = ifelse(is.na(age.x), age.y, age.x)) %>% # we generate a joint 'age' variable
  select(-age.y, -age.x) # drop the superfluous columns

> c
  id sex age
1  a   M  18
2  b   F  32
3  c   F   9
4  d   M  20

请注意,这将会给您一个警告,因为您试图在因子水平上进行连接。这是因为可重现示例中的示例数据是使用 stringsAsFactors = T 生成的。

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