【问题标题】:Aggregate observations across samples by rownames (dplyr) in R通过 R 中的行名(dplyr)聚合样本间的观察
【发布时间】:2021-03-07 20:21:46
【问题描述】:

阿罗哈,

我正在尝试获取示例矩阵中每个行名称的总计数。出于某种原因,我尝试了两种 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(mat)
  • 您共享的mat 的预期输出是什么?您想按行对数据求和吗?

标签: r dplyr group-by summarize rowsum


【解决方案1】:

我们可能只需要rowSums

rowSums(mat)

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

rowsum(mat, row.names(mat))

然后我们在上面使用rowSums

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

【讨论】:

    【解决方案2】:

    @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 的管道(下面的%&gt;%)。
    就像最初的问题一样,如果我们想要按复合计算的总数,我们会这样做:

    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
    

    结合管道 (%&gt;%)、group_bymutateacross 的新版本(上面我使用了 c_across),您可以一次性完成很多工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-17
      • 2014-11-17
      • 2017-11-08
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2020-09-23
      • 2019-03-15
      相关资源
      最近更新 更多