我有一个如下数据集:
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
...
的所有值并循环它们以获取单个子集然后将其提供给函数。有没有更好的办法?我猜这里肯定有一些图书馆做得很好..
编辑:我已将问题更改为更好的说明。希望我这次说清楚。
我认为我遇到的困难是聚合函数需要整个子集产生一个值,而正常的聚合函数(平均值,长度等)从子集中获取一个变量。
答案 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