合并两个数据帧并替换R中的NA值

时间:2015-11-27 09:33:26

标签: r merge dataframe

我有一个主表(a),包含列:id,年龄和性别。例如

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)中的所有缺失数据或表(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 个答案:

答案 0 :(得分:3)

我们可以使用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

答案 1 :(得分:1)

以下是dplyr解决方案:

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生成的。