我正在尝试按ID合并两个不同大小的数据。但是,对于匹配的值,两个数据都包含重复的条目,即数据A中可能有三个ID#3,数据B中可能有三个ID#3.当我尝试合并数据时,结果远大于两者数据合并。
C<-merge(A,B,by="ID",all.x=T,sort=F)
我想通过ID列合并两个数据,这样B对中的第一个ID#3与A中的第一个ID#3,依此类推。
另外,我希望数据A的行顺序保持不变。 sort = FALSE没什么用处:它将所有匹配的行放在顶部,将不匹配的行放在底部。
感谢您的帮助!
答案 0 :(得分:4)
在合并之前,您需要向每个data.frame添加一列,其值记录其自己的ID组中每个观察的索引。
## Example data
A <- data.frame(ID=c(1,1,1,2), ht=1:4)
B <- data.frame(ID=c(1,1,2,2), wt=3:6)
## Add column with number of each observation within ID
A <- transform(A, ID2=ave(ID, ID, FUN=seq_along))
B <- transform(B, ID2=ave(ID, ID, FUN=seq_along))
## Now carry out the merge
merge(A, B, all.x=TRUE, sort=FALSE)
# ID ID2 ht wt
# 1 1 1 1 3
# 2 1 2 2 4
# 3 2 1 4 5
# 4 1 3 3 NA
答案 1 :(得分:2)
感谢您的帮助,这非常有用。我最终在我希望保留顺序的较大数据中添加了一列数字。
使用@Josh O'Brien的例子,
> ## Example data
> A <- data.frame(ID=c(1,1,1,2), ht=1:4)
> B <- data.frame(ID=c(1,1,2,2), wt=3:6)
>
> ## Add column with number of each observation within ID
> A <- transform(A, ID2=ave(ID, ID, FUN=seq_along))
> B <- transform(B, ID2=ave(ID, ID, FUN=seq_along))
>
> # Add a new column in A that numbers the row from 1 to number of row
> A$ORDER_DATA <- 1:nrow(A)
>
> ## Now carry out the merge
> C<-merge(A, B, all.x=TRUE, sort=FALSE)
>
> # Sort the merged data by ORDER_DATA column
> D<-C[with(C,order(ORDER_DATA)),]
> D
ID ID2 ht ORDER_DATA wt
1 1 1 1 1 3
2 1 2 2 2 4
4 1 3 3 3 NA
3 2 1 4 4 5