2012-11-26 54 views
1

可能重複:
Aggregate R sum崩潰的數據幀,增加值係數

我有一個看起來像這樣的數據幀:

sample value 
1  a  1 
2  a  2 
3  b  3 
4  b  4 
5  b  5 
6  c  6 

我要崩潰數據幀超過sample的水平(可能是字符向量或因子),將所有的value個S,所以我得到的數據幀是這樣的:

sample sum 
1  a 3 
2  b 12 
3  c 6 

今天是星期一早上,和所有我能想到的是寫一個複雜for循環。我該如何使用apply,plyr等來對此進行矢量化?

回答

7

如果你不希望加載包:

df <- read.table(text=" sample value 
1  a  1 
2  a  2 
3  b  3 
4  b  4 
5  b  5 
6  c  6",header=TRUE) 

aggregate(df$value,by=list(sample=df$sample),sum) 

    sample x 
1  a 3 
2  b 12 
3  c 6 

或者如果你喜歡的公式語法:

aggregate(value ~ sample, df, sum) 

    sample value 
1  a  3 
2  b 12 
3  c  6 
4

我喜歡演員,對於這些類型的問題,因爲它的快速和直觀:

library(reshape2) 
dcast(your_df, sample ~ ., sum) # or just cast with the original reshape 

我也很喜歡總結,對於這種類型的問題。

library(plyr) 
ddply(df,.(sample),summarise, sum=sum(value)) 
+0

謝謝布蘭登。 upvoted因爲這對我簡單的例子有效,但是當我的數據框有許多其他列時,上面的代碼返回一個錯誤「未定義列選擇」。 –

+0

很難診斷,至少沒有看到你的數據str()。但你總是可以子集並投射'dcast(your_df [1:2],sample〜。,sum)' –

+0

ddply /彙總代碼中的小錯誤。應該是:'ddply(df,。(sample),summarize,sum = sum(value))'這可能會解決您所看到的錯誤。 – JAShapiro

1

一種解決方案使用R基本功能是

aggregate(x = df$value, by = list(df$sample), FUN = sum) 

你也可以用ddply從plyr包

ddply(df,.(sample),numcolwise(sum)) 

這裏df是您的data.frame

3

「典型的」 R命令是tapply

n <- 17; fac <- factor(rep(1:3, length = n), levels = 1:5) 
df=data.frame(target=1:n, factor=fac) 
with(df, tapply(target, fac, sum)) 

通過骨料這兩個工作,但輸入輸出列表或對象是愚蠢的。此外ddplyplyr將工作,但有些不太清楚的語法雖然它進入自己的更復雜的例子。

4

在分享的精神,你也可以使用sqldfdata.table包很容易:

您的數據:

df <- read.table(text=" sample value 
1  a  1 
2  a  2 
3  b  3 
4  b  4 
5  b  5 
6  c  6",header=TRUE) 

sqldf替代:

library(sqldf) 
sqldf("select sample, sum(value) `value` from df group by sample") 
# sample value 
# 1  a  3 
# 2  b 12 
# 3  c  6 

data.table替代:

library(data.table) 
DT <- data.table(df, key="sample") 
DT[, list(value = sum(value)), by=key(DT)] 
# sample value 
# 1:  a  3 
# 2:  b 12 
# 3:  c  6 
+0

對於sqldf爲+1,如果您已經知道SQL,則非常有用。 –