按变量列合并具有重复条目的R数据框

4
我正在尝试按ID合并两个不同大小的数据。但是,对于匹配的值,两个数据都包含重复的条目,即Data A中可能有三个ID#3,Data B中也可能有三个ID#3。当我尝试合并数据时,结果比两个数据的总和要大得多。
我想通过ID列合并这两个数据,使B中的第一个ID#3与A中的第一个ID#3配对,依此类推。
同时,我希望Data A的行顺序保持不变。sort = FALSE没有太大帮助:它将所有匹配的行放在顶部,将不匹配的行放在底部。
谢谢您的帮助!

C<-merge(A,B,by="ID",all.x=T,sort=F)


2
如何制作可重现的示例?(https://dev59.com/eG025IYBdhLWcg3whGSx) - Arun
2个回答

5

在合并之前,您需要为每个数据框添加一列,其值记录其所属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

没有 sort = FALSE 这一部分,合并操作会自动假设 sort = TRUE 并按照数字大小从小到大对行进行排序。我会尝试搞清楚这个问题 ^^ - shirleywu
不确定您实际想要的顺序,但听起来可能是这个:merge(A[1:2], merge(A, B, all.x=TRUE, sort=FALSE))。看起来对吗? - Josh O'Brien
使用添加索引列的逻辑,我向A表中添加了一个顺序列,现在数据按照A表排序 :) - shirleywu
@shirleywu -- 太好了。那也是我的另一个想法。出于好奇,你有没有发现任何情况,使得我上面的最后一个建议不如添加一个顺序列?干杯。 - Josh O'Brien
它以一种我无法描述的奇怪方式对数据进行排序,并添加了大约230行新数据。 - shirleywu
显示剩余2条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接