如何在 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)
我想按“类群”分组,然后对数字求和。
- 选项 1:
s <- split(df, df$taxa)
ON1 <- as.data.frame(lapply(s, function(x) {
sum(x[, c("ON1")])
}))
- 选项 2:
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)
使用groupby
和summarize_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
我在 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)
我想按“类群”分组,然后对数字求和。
- 选项 1:
s <- split(df, df$taxa)
ON1 <- as.data.frame(lapply(s, function(x) {
sum(x[, c("ON1")])
}))
- 选项 2:
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)
使用groupby
和summarize_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