如何在子集上聚合并返回一个值?

时间:2013-03-04 14:58:25

标签: r aggregate aggregation

我有一个如下数据集:

id tag x y z
1  "A" 1 2 3
2  "B" 0 2 4
3  "A" 0 0 1
4  "B" 1 3 4

我有一个函数agg,它接受​​按tag分组的子集,即参数为:

id tag x y z
1  "A" 1 2 3
3  "A" 0 0 1

假设agg是子集中所有x y z的简单总和,因此给7的结果,对于带{的子集{1}}。

所以我想要的是最终结果,如:

tag=="A"

我可以列出"A" 7 "B" 14 ... 的所有值并循环它们以获取单个子集然后将其提供给函数。有没有更好的办法?我猜这里肯定有一些图书馆做得很好..

编辑:我已将问题更改为更好的说明。希望我这次说清楚。

我认为我遇到的困难是聚合函数需要整个子集产生一个值,而正常的聚合函数(平均值,长度等)从子集中获取一个变量。

2 个答案:

答案 0 :(得分:1)

我认为您想要使用reshape2重塑形状。 。 。

library(reshape2)
df <- read.table(
  header=TRUE, text='
id tag x y z
1  "A" 1 2 3
2  "B" 0 2 4
3  "A" 0 0 1
4  "B" 1 3 4
')
df[,1]<- NULL
df2<- melt(df, id="tag")
dcast(df2, tag~., sum)

#  tag NA
#1   A  7
#2   B 14

答案 1 :(得分:1)

ds <- read.table(text='id tag x y z
 1  "A" 1 2 3
 2  "B" 0 2 4
 3  "A" 0 0 1
 4  "B" 1 3 4', header=TRUE)

lapply(split(ds[c('x','y','z')], ds$tag), sum)
$A
[1] 7

$B
[1] 14