折叠数据框,添加因子值

时间:2012-11-26 14:47:32

标签: r

  

可能重复:
  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,所以我得到的结果数据框如下所示:< / p>

  sample sum
1      a   3
2      b  12
3      c   6

星期一早上,我能想到的只是写一个复杂的for循环。我怎样才能使用apply,plyr等对它进行矢量化?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

我喜欢演员,因为它快速而直观,因为这些类型的问题:

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

我也喜欢总结一下这类问题。

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

答案 2 :(得分: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

答案 3 :(得分: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))

聚合 两者都有效但输入输出为列表或 by 对象太愚蠢了。来自 plyr ddply 也会有效,但语法上不太清晰,尽管它更适用于更复杂的示例

答案 4 :(得分:1)

使用R base函数的一种解决方案是

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

您也可以使用plyr package

中的ddply来完成此操作
ddply(df,.(sample),numcolwise(sum))

此处df是您的data.frame