找到并合并data.frame中的重复行但忽略列顺序

jdf*_*ch3 5 r duplicates plyr dataframe

我有一个包含1,000行和3列的data.frame.它包含大量的重复项,我已经使用plyr来组合重复的行,并为每个组合添加一个计数,如本主题中所述.

这是我现在拥有的一个例子(如果我需要从那里开始,我还有原始的data.frame以及所有重复项):

   name1    name2    name3     total
1  Bob      Fred     Sam       30
2  Bob      Joe      Frank     20
3  Frank    Sam      Tom       25
4  Sam      Tom      Frank     10
5  Fred     Bob      Sam       15
Run Code Online (Sandbox Code Playgroud)

但是,列顺序无关紧要.我只是想知道有多少行以任何顺序具有相同的三个条目.如何组合包含相同条目的行,忽略顺序?在这个例子中,我想要组合行1和5,以及行3和4.

Tim*_*m P 4

定义另一列,它是名称的“排序粘贴”,第 1 行和第 5 行具有相同的“Bob~Fred~Sam”值。然后基于该值进行聚合。

简短的代码片段(假设原始数据帧是dd):这一切都非常直观。我们创建一个lookup列(看一下,应该是不言自明的),获取total每个组合的列的总和,然后过滤到唯一的组合......

dd$lookup=apply(dd[,c("name1","name2","name3")],1,
                                  function(x){paste(sort(x),collapse="~")})
tab1=tapply(dd$total,dd$lookup,sum)
ee=dd[match(unique(dd$lookup),dd$lookup),]
ee$newtotal=as.numeric(tab1)[match(ee$lookup,names(tab1))]
Run Code Online (Sandbox Code Playgroud)

您现在拥有ee一组唯一的行及其相应的总计数。简单 - 不需要外部包。最重要的是,您可以看到该过程的每个阶段正在发生什么!

(小更新以帮助OP:)如果您想要最终答案的清理版本:

outdf = with(ee,data.frame(name1,name2,name3,
                           total=newtotal,stringsAsFactors=FALSE))
Run Code Online (Sandbox Code Playgroud)

total这为您提供了一个整洁的数据框架,其中包含三个最重要的名称列,以及名为而不是 的列中的聚合总数newtotal