R合并三个数据帧而不形成笛卡尔积

use*_*786 4 merge r dataframe

我有以下数据帧a,b,c

Year<-rep(c("2002","2003"),1)
Crop<-c("TTT","RRR")
a<-data.frame(Year,Crop)

Year<-rep(c("2002","2003"),2)
ProductB<-c("A","A","B","B")
b<-data.frame(Year,ProductB)

Year<-rep(c("2002","2003"),3)
Location<-c("XX","XX","YY","YY","ZZ","ZZ")
c<-data.frame(Year,Location)
Run Code Online (Sandbox Code Playgroud)

并希望将他们聚在一起.当我使用该merge功能时,我得到的笛卡尔产品不是我想要的.

d<-merge(a,b,by="Year")
e<-merge(d,c,by="Year")
Run Code Online (Sandbox Code Playgroud)

我希望数据框看起来像

Year   Crop    ProductB    Location
 2002  TTT      A              XX
 2002   NA      B              YY
 2002   NA      NA             ZZ
 2003  RRR      A              XX 
 2003   NA      B              YY
 2003   NA      NA             ZZ
Run Code Online (Sandbox Code Playgroud)

这可能吗?谢谢你的帮助

Aru*_*run 5

这是使用的一种方式data.table.

require(data.table) ## 1.9.2
# (1)
setDT(a)[, GRP := 1:.N, by=Year]
setDT(b)[, GRP := 1:.N, by=Year]
setDT(c)[, GRP := 1:.N, by=Year]
# (2)
merge(a, merge(b, c, by=c("Year", "GRP"), 
          all=TRUE), by=c("Year", "GRP"), all=TRUE)

#    Year GRP Crop ProductB Location
# 1: 2002   1  TTT        A       XX
# 2: 2002   2   NA        B       YY
# 3: 2002   3   NA       NA       ZZ
# 4: 2003   1  RRR        A       XX
# 5: 2003   2   NA        B       YY
# 6: 2003   3   NA       NA       ZZ
Run Code Online (Sandbox Code Playgroud)
  • (1) - setDT转换data.frame为data.table,然后我们GRP通过分组创建一个新列Year.有了这个,我们就有了独特的组合Year, Grp.
  • (2) - 我们合并了两列Year, GRP.

.N 是一个内置变量,用于保存该组的行数.