我有一個看起來像這樣的數據幀:
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等來對此進行矢量化?
我有一個看起來像這樣的數據幀:
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等來對此進行矢量化?
如果你不希望加載包:
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
我喜歡演員,對於這些類型的問題,因爲它的快速和直觀:
library(reshape2)
dcast(your_df, sample ~ ., sum) # or just cast with the original reshape
我也很喜歡總結,對於這種類型的問題。
library(plyr)
ddply(df,.(sample),summarise, sum=sum(value))
一種解決方案使用R基本功能是
aggregate(x = df$value, by = list(df$sample), FUN = sum)
你也可以用ddply
從plyr包
ddply(df,.(sample),numcolwise(sum))
這裏df
是您的data.frame
「典型的」 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))
通過和骨料這兩個工作,但輸入輸出列表或由對象是愚蠢的。此外ddply從plyr將工作,但有些不太清楚的語法雖然它進入自己的更復雜的例子。
在分享的精神,你也可以使用sqldf
和data.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
對於sqldf爲+1,如果您已經知道SQL,則非常有用。 –
謝謝布蘭登。 upvoted因爲這對我簡單的例子有效,但是當我的數據框有許多其他列時,上面的代碼返回一個錯誤「未定義列選擇」。 –
很難診斷,至少沒有看到你的數據str()。但你總是可以子集並投射'dcast(your_df [1:2],sample〜。,sum)' –
ddply /彙總代碼中的小錯誤。應該是:'ddply(df,。(sample),summarize,sum = sum(value))'這可能會解決您所看到的錯誤。 – JAShapiro