R:按子组对每一列求和

时间:2018-10-01 03:26:30

标签: r aggregate

我有一个植物物种出现数据的矩阵。设置矩阵,以便每一列都是一个物种,每一行都是一个采样位置。我还具有根据某些环境变量对采样位置进行分组的标识符。我想为每个物种创建列总和,但按特定环境变量进行分组。

示例数据集:

javac

因此,现在有20个样地,观察到30种物种,以及5个相关的环境变量。我想生成每个物种观察到的个体总数,并按“管理”分组。我已经尝试过这样的事情:

library(vegan)
data("dune")
data("dune.env")
dune$plot <- c(1:20); dune.env$plot <- c(1:20)
merge(dune, dune.env)

但是我总是会得到关于不正确的暗淡的错误。我不确定如何解决我的问题。理想情况下,结果将是一个具有4行(每种管理类型为1行)的数据帧,其中所有物种(cols 2:31)都已求和。

3 个答案:

答案 0 :(得分:0)

使用data.table

require(data.table)
a <- merge(dune, dune.env)
setDT(a)
a[, lapply(.SD, sum), by = Management, .SDcols = names(a)[2:31]]

答案 1 :(得分:0)

好吧,几天前我在做类似的事情: How to obtain species richness and abundance for sites with multiple samples using dplyr

要修改@akrun给出的出色答案:

  df <- merge(dune, dune.env)
  library(dplyr)
  df2<- df %>% 
      group_by(Management) %>% 
      summarise_at(sum, .vars = vars(Achimill:Callcusp)) 

答案 2 :(得分:0)

rowsums完成您需要的操作:

dat <- merge(dune, dune.env)

> rowsum(dat[,2:31], dat$Management)
   Achimill Agrostol Airaprae Alopgeni Anthodor Bellpere Bromhord Chenalbu   ...
BF        7        0        0        2        4        5        8        0   ...    
HF        6        7        0        8        9        2        4        0   ...     
NM        2       13        5        0        8        2        0        0   ...     
SF        1       28        0       26        0        4        3        1   ...