R:如何在'by'是变量的函数中使用聚合?

时间:2014-07-29 16:12:44

标签: r

我正在尝试编写一个使用汇总列创建新数据框的函数。我可以单独使用聚合:

df = aggregate(. ~ Family, data=df, FUN=sum)

但我想用列表中的对象替换'Family':

levels = c('Family','Order','Class','Phylum','Superkingdom')
for (i in 1:5){
    OTU = levels[i]
    df = lineage[,c(OTU,'Abundance')]
    df = aggregate(. ~ OTU, data=df, FUN=sum)
}

在上面的代码中,数据框中的“沿袭”具有选择生物的分类水平,加上丰度值。我想做的是为每个分类水平创建一个新的,总结的数据框架,并总结丰度值。

我在这里发现了很多关于聚合的帖子,但仍然无法让它发挥作用。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您有兴趣将其扩展到简单Abundance以外,我会将两个变量包括在内进行总结。这样的事情可以奏效:

set.seed(42)

taxa <- c('Family','Order','Class','Phylum','Superkingdom')
df <- data.frame(ID = 1:15, Abundance = runif(15), HomeRange = abs(rnorm(15)), taxa = rep(taxa, times = 3))

(output2 <- aggregate(cbind(HomeRange, Abundance) ~ taxa, data = df, FUN = sum))

结果如下:

#           taxa HomeRange Abundance
# 1        Class  1.413938  1.355478
# 2       Family  2.556280  1.891644
# 3        Order  3.317171  2.392776
# 4       Phylum  2.129622  1.742869
# 5 Superkingdom  4.031149  1.809103

同样,对于一个变量:

(output1 <- aggregate(Abundance ~ taxa, data = df, FUN = sum))

#           taxa Abundance
# 1        Class  1.355478
# 2       Family  1.891644
# 3        Order  2.392776
# 4       Phylum  1.742869
# 5 Superkingdom  1.809103