我有以下数据帧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)
这可能吗?谢谢你的帮助
这是使用的一种方式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 是一个内置变量,用于保存该组的行数.