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.
定义另一列,它是名称的“排序粘贴”,第 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。