@akrun 的回答完全符合发帖者的要求,但我发现自己处于类似但略有不同的情况很多,但使用的数据框具有矩阵中的重复行名,所以这些现在是列中的值(下面称为“复合”),如下所示:
set.seed(2347813)
df <- data.frame(matrix(sample(c(0,1,2,3,4,5,6,7,8,9),
size=30, replace=T), nrow=6, ncol=5))
colnames(df) <- c("sample_1", "sample_2", "sample_3", "sample_4", "sample_5")
df$compound <- c("CHO", "NO", "O", "CHO", "NO", "O")
看起来像:
sample_1 sample_2 sample_3 sample_4 sample_5 compound
1 0 1 4 9 1 CHO
2 3 8 3 0 5 NO
3 8 9 7 1 7 O
4 8 2 9 7 7 CHO
5 3 8 9 0 5 NO
6 6 1 6 7 5 O
然后我想以各种方式汇总数据,但我想按复合分组,并使用来自 dplyr/tidyverse 的管道(下面的%>%)。
就像最初的问题一样,如果我们想要按复合计算的总数,我们会这样做:
df %>%
group_by(compound) %>%
summarize(total=sum(c_across(starts_with("sample"))))
这会给我们:
compound total
<chr> <dbl>
1 CHO 48
2 NO 44
3 O 57
但我认为最好的部分是一次执行多个汇总操作的能力。假设我们只需要 sample_1 到 sample_3 的总数、平均值、标准差和平均值,我们可以在一个管道命令中得到所有这些:
df %>%
group_by(compound) %>%
summarize(total=sum(c_across(starts_with("sample"))),
grand_mean=mean(c_across(starts_with("sample"))),
sd=sd(c_across(starts_with("sample"))),
mean_13=mean(c_across(sample_1:sample_3))) # mean of sample 1-3
这给了我们:
# A tibble: 3 x 5
compound total grand_mean sd mean_13
<chr> <dbl> <dbl> <dbl> <dbl>
1 CHO 48 4.8 3.58 4
2 NO 44 4.4 3.20 5.67
3 O 57 5.7 2.71 6.17
结合管道 (%>%)、group_by、mutate 和 across 的新版本(上面我使用了 c_across),您可以一次性完成很多工作。