在 R 中按行名 (dplyr) 汇总样本观察结果

Aggregate observations across samples by rownames (dplyr) in R

阿罗哈,

我正在尝试获取样本矩阵中每一行名称的总计数。出于某种原因,我尝试了 rowsum 然后转换为数据框并使用 dplyr::group_by 但它们给出了错误。这是示例数据的一个子集:

mat = matrix(c(0,1,2,3,4), nrow=3, ncol = 5)
rownames(mat) <- c("CHO", "NO", "O")
colnames(mat) <-  c("sample_1", "sample_2", "sample_3", "sample_4", "sample_5")`

我想要一个带有公式名称的结果数据框,然后总体上观察到样本间观察值的总和和样本公式的百分比。

这看起来很简单,但我已经尝试了所有不同的组合来聚合数据,但都无济于事,非常感谢您提供一些指导。

我们可能只需要rowSums

rowSums(mat)

如果有重复的行名(在示例数据中,行名是唯一的),那么我们使用 rowsum 并将 group 指定为 rownames

rowsum(mat, row.names(mat))

然后我们在上面使用 rowSums

rowSums(rowsum(mat, row.names(mat)))

@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_bymutate和新版本的across(上面我使用了c_across)你可以得到一气呵成。