我有一个主表(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)
。结果不是我想要的。有什么方法可以解决这个问题吗?谢谢!
答案 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
生成的。