2011-03-29 111 views
2

我正在使用的數據集與下面的數據集相似(儘管該示例的規模要小得多,我正在使用的數據是成千上萬行的數據),但我一直無法弄清楚如何讓R根據組號碼合計列數據。基本上,我希望能夠分別爲81和66組中的所有組添加綠色(s),藍色(s)和紅色(s),然後能夠使用該信息來計算百分比。如何根據使用R的組名稱添加列數據?

txt <- "Group Green Blue Red Total 
81 15 10 21 46 
81 10 10 10 30 
81 4 8 0 12 
81 42 2 2 46 
66 11 9 1 21 
66 5 14 5 24 
66 7 5 2 14 
66 1 16 3 20 
66 22 4 2 28" 

dat <- read.table(textConnection(txt), sep = " ", header = TRUE) 

我花了很多時間一個很好的協議,試圖找出如何使用一些功能對我自己,希望我會跨越一個適當的方式做到這一點絆倒,但因爲我是個新基本用戶,我覺得我已經碰到了一堵牆,我無法在沒有幫助的情況下前進。

回答

4

單程通過aggregate。假設你的數據在一個對象x

aggregate(. ~ Group, data=x, FUN=sum) 
# Group Green Blue Red Total 
# 1 66 46 48 13 107 
# 2 81 71 30 33 134 
+0

謝謝你的迴應,我已經能夠得到它的運行聚合函數,但我不明白的顯示沿着你的例子的線。我錯過了另一個命令嗎? – nlandis 2011-03-29 21:16:02

+0

@nlandis:我的猜測是你正在分配結果(即'foo < - aggregate(...)')。如果你想打印結果,只需輸入'foo'。 – 2011-03-29 21:23:52

+0

@nlandis - 您是否將函數賦值給一個新對象(即'results < - aggregate(...)'?如果您分配了一個新對象,R通常不會向控制檯返回大量信息。 – Chase 2011-03-29 21:23:58

1

我建議@約書亞的答案是整潔,但是你應該學會兩個功能是applytapply。如果a是你的數據集,則:

## apply calculates the sum of each row 
> total = apply(a[,2:4], 1, sum) 
## tapply calculates the sum based on each group 
> tapply(total, a$Group, sum) 
66 81 
107 134 
+0

非常感謝您的回覆。雖然我一直在努力工作的聚合功能,我一直在嘗試應用和tapply函數,但還沒有完全弄清楚它們。 – nlandis 2011-03-29 21:16:47

2

上述問題的答案兩者都是如何解決這類問題的最好例子。其他兩種選擇中reshapeplyr

library(reshape) 
cast(melt(dat, "Group"), Group ~ ..., sum) 

library(plyr) 
ddply(dat, "Group", function(x) colSums(x[, -1])) 
相關問題