• R语言
  • 两个数据集按照某个共同字段合并的问题

R软件中,如何实现这个功能:就是两个数据集A、B合并,
同时能根据A、B中共有的某一字段,将A中的数据改为B的数据
比如数据集A:
name val1 val2
A 0 1
B 1 1
C 1 0
数据集B:
name val2 val3
A 0 1
B 0 0
D 1 1
需要的结果为
name val1 val2 val3
A 0 0 1
B 1 0 0
C 1 0 NA
D NA 1 1
join函数,你需要看下leftjoin和rightjoin基本知识
准确来说应该是,以共同的字段为依据,用数据集B中的数据来更新数据集A!请大神帮忙!
比如数据集A:
name v1 v2
A 0 1
B 1 1
C 1 0
数据集B:
name v2 v3
A 0 1
B 0 0
D 1 1

需要的结果为
name v1 v2 v3
A 0 0 1
B 1 0 0
C 1 0 NA
D NA 1 1
[未知用户]
我试了join函数,不能达到我想要的结果!
试了dlpyr::left_join函数还是不能得到想要的结果!
[未知用户]
a <- data.frame(name = c('A','B','C'),val1 = c(0,1,1),val2 = c(1,1,0))
b <- data.frame(name = c('A','B','D'),val2 = c(0,0,1),val3 = c(1,0,1))
c = join(x = a,y = b,type = 'full',match = 'all',by = 'name')
我是不懂你是怎么测出来不对的,反正我测出来是可以的
A <- data.frame(name = c('A','B','C'),v1 = c(0,1,1),v2 = c(1,1,0))
B <- data.frame(name = c('A','B','D'),v2 = c(0,0,1),v3 = c(1,0,1))
library(sqldf)
sqldf("SELECT A.name
,A.v1
,CASE WHEN B.v2 IS NOT NULL
THEN B.v2
ELSE A.v2
END v2
,B.v3
FROM A
LEFT JOIN B USING (name)
UNION ALL
SELECT B.name, A.v1, B.v2, B.v3
FROM B
LEFT JOIN A USING (name)
WHERE A.name IS NULL")
[未知用户]
按照你的方法 得到的结果是
name val1 val2 val3
A 0 1 1
B 1 1 0
C 1 0 NA
D NA 1 1

虽然完成了A与B按照name匹配合并了,但是关键的地方是数据集A的val2的值没有用数据集B中的val2的值来更新!
但还是感谢你的方法,至少前进了一步。
[未知用户]

感谢大神解决我的问题了,向你学习,我好好研究一下sqldf包怎么实现的。 :-)
B 1 0 1 ,这列就是错的吧,怎么匹配都不会是
应该是 B 1 0 0,楼主去看下吧
结果应该是
1 a 0 0 1
2 b 1 0 0
3 c 1 0 NA
4 d NA 1 1
附上具体code

a <- data.frame(name = c("a","b","c"),val1 = c(0,1,1),val2 = c(1,1,0))
b <- data.frame(name = c("a","b","d"),val2 = c(0,0,1),val3 = c(1,0,1))
ab<-merge(a,b,by.x=c("name"),by.y=c("name"),all.x=TRUE,all.y=TRUE)
ab[is.na(ab$val2.y)==TRUE,]$val2.y<-ab[is.na(ab$val2.y)==TRUE,]$val2.x
ab<-ab[,-3]
names(ab)[3]<-"val2"
ab
[未知用户]
是的,我在3楼中已经改过来了!
[未知用户]
在你的方法的提示下,可以将A与B位置互换,以B的值为准(相当于更新了A的值)

A <- data.frame(name = c('A','B','C'),v1 = c(0,1,1),v2 = c(1,1,0))
B <- data.frame(name = c('A','B','D'),v2 = c(0,0,1),v3 = c(1,0,1))
library(plyr)
X = join(B,A,by='name',type='full')
#得到的结果
# name v2 v3 v1
#1 A 0 1 0
#2 B 0 0 1
#3 D 1 1 NA
#4 C 0 NA 1

#再调整一下,就可以了!
attach(X)
Y = data.frame(name, v1, v2, v3)
# 结果
# name v1 v2 v3
# 1 A 0 0 1
# 2 B 1 0 0
# 3 D NA 1 1
# 4 C 1 0 NA
[未知用户]
感谢,你的代码也能解决我的问题,而且你只用了merge函数,学习了!谢谢!
5 天 后
回复 7 楼wang138699

今儿尝试运行了下这sqldf,摸不着头脑... 运用sqldf看来df1 join df2还不是俺的强项啊! :-(

[未知用户]

merge()只限于两个数据框,个人一般上会使用reshape2::merge_all()