5

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

ただし、列の順序は重要ではありません。同じ3つのエントリが任意の順序でいくつの行にあるかを知りたいだけです。順序を無視して、同じエントリを含む行を組み合わせるにはどうすればよいですか?この例では、行1と5、および行3と4を組み合わせます。

4

2 に答える 2

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))]

これでee、一連の一意の行とそれに対応する合計数ができました。簡単-外部パッケージは必要ありません。そして決定的に、あなたはプロセスのすべての段階で何が起こっているかを見ることができます!

(OPを支援するためのマイナーアップデート:)そして、最終回答のクリーンアップバージョンが必要な場合:

outdf = with(ee,data.frame(name1,name2,name3,
                           total=newtotal,stringsAsFactors=FALSE))

totalこれにより、3つの非常に重要な名前の列と、ではなくと呼ばれる列に集計された合計を含む、きちんとしたデータフレームが得られますnewtotal

于 2012-06-09T07:03:14.597 に答える
4

インデックス列を並べ替えてから、を使用ddplyして集計と合計を行います。

データを定義します。

dat <- "   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"

x <- read.table(text=dat, header=TRUE)

コピーを作成します。

xx <- x

apply列を並べ替えてから集計するために使用します。

xx[, -4] <- t(apply(xx[, -4], 1, sort))
library(plyr)
ddply(xx, .(name1, name2, name3), numcolwise(sum))
  name1 name2 name3 total
1   Bob Frank   Joe    20
2   Bob  Fred   Sam    45
3 Frank   Sam   Tom    35
于 2012-06-09T07:05:01.207 に答える