2012-05-03 11 views
11

これはおそらく愚かな質問ですが、私はデータフレームのCrawleyの章を読んでインターネットを精査し、まだ何かを動かすことができませんでした。ここで 特定の要素の組み合わせに基づいた行の合計

は私に似たサンプルデータセットである:私がやりたい何

> data<-data.frame(site=c("A","A","A","A","B","B"), plant=c("buttercup","buttercup", 
"buttercup","rose","buttercup","rose"), treatment=c(1,1,2,1,1,1), 
plant_numb=c(1,1,2,1,1,2), fruits=c(1,2,1,4,3,2),seeds=c(45,67,32,43,13,25)) 
> data 
    site  plant treatment plant_numb fruits seeds 
1 A buttercup   1   1  1 45 
2 A buttercup   1   1  2 67 
3 A buttercup   2   2  1 32 
4 A  rose   1   1  4 43 
5 B buttercup   1   1  3 13 
6 B  rose   1   2  2 25 

は「シード」と「果物」は合計されたシナリオを作成する場合は常にユニークなサイト&植物&治療& plant_numbの組み合わせ存在する。理想的には、この行の削減が、元の列の保全(つまり、私はこのように見えるように、上記の例を必要とする:)

site  plant treatment plant_numb fruits seeds 
1 A buttercup   1   1  3 112 
2 A buttercup   2   2  1 32 
3 A  rose   1   1  4 43 
4 B buttercup   1   1  3 13 
5 B  rose   1   2  2 25 

ことになる。この例では、かなり基本的なものです(私のデータセットは〜5000行です)、ここでは合計する必要がある2つの行のみが表示されますが、合計する必要がある行の数は1から45までの範囲です。

私はrowsum()とtapply()を試みてきましたが、これまでのところかなりの結果しか得られていませんでした(これらの関数は要素に意味がないと私に伝えています)。非常にそれを感謝します!

ありがとうございます!

+0

外観'plyr'と' data.table'タグです。基本的には多くの疑問があります。がんばろう! – Chase

+0

も参照してください。http://4dpiecharts.com/2011/12/16/a-quick-primer-on-split-apply-combine-problems/ –

答えて

11

次のコードは、かなり自明です。それは基本関数 "集計"を使用し、基本的には、サイト、植物、処理、plant_numのそれぞれの固有の組み合わせについて、果実の合計と種の合計を表示します。

# Load your data 
data <- data.frame(site=c("A","A","A","A","B","B"), plant=c("buttercup","buttercup", 
"buttercup","rose","buttercup","rose"), treatment=c(1,1,2,1,1,1), 
plant_numb=c(1,1,2,1,1,2), fruits=c(1,2,1,4,3,2),seeds=c(45,67,32,43,13,25)) 

# Summarize your data 
aggregate(cbind(fruits, seeds) ~ 
     site + plant + treatment + plant_numb, 
     sum, 
     data = data) 
# site  plant treatment plant_numb fruits seeds 
#1 A buttercup   1   1  3 112 
#2 B buttercup   1   1  3 13 
#3 A  rose   1   1  4 43 
#4 B  rose   1   2  2 25 
#5 A buttercup   2   2  1 32 

行の変更(と、それは、サイト、植物によって並べ替えられ、...)の順うまくいけば、それは心配のあまりないです。

これを行う別の方法は、plyrパッケージのddplyを使用することです。 @Chaseにより示唆されるように

library(plyr) 
ddply(data, .(site, plant, treatment, plant_numb), 
     summarize, 
     fruits = sum(fruits), 
     seeds = sum(seeds)) 
# site  plant treatment plant_numb fruits seeds 
#1 A buttercup   1   1  3 112 
#2 A buttercup   2   2  1 32 
#3 A  rose   1   1  4 43 
#4 B buttercup   1   1  3 13 
#5 B  rose   1   2  2 25 
+0

恐ろしい - 私は質問をした後、私を強く扇動した。ご協力いただきありがとうございます。あなたが示したようにコードを入力すると、エラー "as.data.frame.default(x)のエラー: がdata.frame"にクラス "formula"を強制することができません。 。それを動作させるためのアイデアはありますか? – user1371443

+0

どちらも、残念ながら。私は、例と私の実際のデータセット(スペースなし)の両方について同じエラーメッセージを表示しています:>集計(cbind(果物、種子)〜サイト+植物+処理+ plant_numb、合計、データ=データ) .data.frame.default(x): クラス "formula"をdata.frameに強制することはできません – user1371443

+0

plyrの解決策はまだ動作するはずです。しかし、あなたは集計の数式バージョンを持っていないように思えます。どのRのバージョンを使用していますか?私は集計が2.11 – Dason

4

万全を期すためには、ここでdata.tableソリューションです。大きなデータセットの場合、これはおそらく最速の方法となります:(。すなわちby機能の列ではない)

library(data.table) 
data.dt <- data.table(data) 
setkey(data.dt, site) 
data.dt[, lapply(.SD, sum), by = list(site, plant, treatment, plant_numb)] 

    site  plant treatment plant_numb fruits seeds 
[1,] A buttercup   1   1  3 112 
[2,] A buttercup   2   2  1 32 
[3,] A  rose   1   1  4 43 
[4,] B buttercup   1   1  3 13 
[5,] B  rose   1   2  2 25 

lapply(.SD, sum)部分はグループ化セットの一部ではないすべての列を合計で

関連する問題