如何在 R 中使用循环进行分组和求和?

How to group and sum using a loop in R?

我在 R 中有一个类似于这个的 df:

taxa <- c("bac", "bac", "bac", "bac", "bac", "bac", "arch", "arch", "arch")
ON1 <- c(2, 45, 34, 90, 0, 39, 12, 11, 5)
ON2 <- c(22, 67, 87, 90, 0, 0, 77, 21, 20)
ON3 <- c(46, 55, 1, 3, 0, 100, 88, 66, 9)
df <- data.frame(taxa, ON1, ON2, ON3, ON4)

我想按“类群”分组,然后对数字求和。

    s <- split(df, df$taxa)
    ON1 <- as.data.frame(lapply(s, function(x) {
    sum(x[, c("ON1")])
    }))
    ON1 <- tapply(df$ON1, df$taxa, FUN=sum)
    ON1 <- as.data.frame(ON1)

结果:Bac (210) 和 Arch (28)

选项 1 和 2 都可以满足我的要求,但我想创建一个循环,以便我可以同时为 ON2 和 ON3 等执行此操作。(我还有很多列)

谢谢!

我们可以使用aggregate

> aggregate(. ~ taxa, df, sum)
  taxa ON1 ON2 ON3
1 arch  28 118 163
2  bac 210 266 205

不用循环,使用 tidyverse 函数更容易。为此,您按变量和 summarize 进行“分组”,汇总函数为 sum.

library(tidyverse)
df %>%
    group_by(taxa) %>%
    summarize(across(ON1:ON3, sum))
#> # A tibble: 2 × 4
#>   taxa    ON1   ON2   ON3
#>   <chr> <dbl> <dbl> <dbl>
#> 1 arch     28   118   163
#> 2 bac     210   266   205
Created on 2021-09-29 by the reprex package (v2.0.1)

使用groupbysummarize_each:

df %>% group_by(taxa) %>% summarize_each(sum)

输出:

taxa    ON1     ON2     ON3
<fct>   <dbl>   <dbl>   <dbl>
arch    28      118     163
bac     210     266     205

data.table

library(data.table)
setDT(df)[, lapply(.SD, sum), by = taxa]

   taxa ON1 ON2 ON3
1:  bac 210 266 205
2: arch  28 118 163