2012-05-03 26 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行),雖然在這裏你只看到需要求和的兩行,但需要求和的行數是不同的,範圍從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。

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」 。任何想法使其工作? – user1371443

+0

兩者都不幸。對於示例和我的實際數據集(不含空格),我都得到相同的錯誤信息:> aggregate(cbind(fruits,seeds)〜site + plant + treatment + plant_numb,sum,data = data) as .data.frame.default(x): 不能強制類「公式」到一個data.frame – user1371443

+0

plyr解決方案應該仍然工作,我猜。但是這聽起來像你沒有聚合的公式版本。你使用哪個版本的R?我認爲聚合已經允許公式輸入自2.11 – Dason

4

以及物品是否完整,這裏是data.table解決方案,通過@Chase的建議。對於更大的數據集,這將可能是最快的方法:

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)部分總結了您的所有列不在分組集的一部分(即列不在by功能)

相關問題