【问题标题】:How to assign factors for each column and calculate rowmeans based on the factor level如何为每列分配因子并根据因子水平计算rowmeans
【发布时间】:2017-11-29 11:36:32
【问题描述】:

我有一个数据框,我想根据某些条件计算行均值,
示例:

df= 
rownames    A1  A2  A3  B1  B2  B3
r1  1   2   3   4   5   6
r2  1   2   3   4   5   6
r3  1   2   3   4   5   6

treatment= factor(rep(c("A","B"),each=3))

我想根据处理的因子水平得到每一行的均值,数据如下:

rownames    A   B
r1  2   5
r2  2   5
r3  2   5

对此有什么想法吗?

【问题讨论】:

    标签: r dataframe mean


    【解决方案1】:

    在基础 R 中使用 grep:

    sapply(levels(treatment), function(a) rowMeans(df[,grep(a, names(df))]))
    
    #     A B
    #[1,] 2 5
    #[2,] 2 5
    #[3,] 2 5
    

    【讨论】:

      【解决方案2】:

      我们可以使用来自data.table 的melt 来做到这一点。 measure 参数可以采用多个patterns 转换为“长”格式,按“行名”分组并指定.SDcols 中的列,循环遍历Data.table (.SD) 的子集并获取@ 987654327@

      library(data.table)
      melt(setDT(df), measure = patterns("^A", "^B"), value.name = c('A', 'B'))[, 
                    lapply(.SD, mean), rownames, .SDcols = A:B]
      #   rownames A B
      #1:       r1 2 5
      #2:       r2 2 5
      #3:       r3 2 5
      

      注意:输出是 data.table,可以转换为 data.frame (setDF),如 OP 的输出所示


      另一个选项是split 来自base R

      sapply(split.default(df[-1], sub("\\d+", "", names(df)[-1])), rowMeans)
      #     A B
      #[1,] 2 5
      #[2,] 2 5
      #[3,] 2 5
      

      数据

      df <- structure(list(rownames = c("r1", "r2", "r3"), A1 = c(1L, 1L, 
      1L), A2 = c(2L, 2L, 2L), A3 = c(3L, 3L, 3L), B1 = c(4L, 4L, 4L
      ), B2 = c(5L, 5L, 5L), B3 = c(6L, 6L, 6L)), .Names = c("rownames", 
      "A1", "A2", "A3", "B1", "B2", "B3"), class = "data.frame", row.names = c(NA, 
      -3L))
      

      【讨论】:

      • 谢谢。如果模式不是很严格怎么办。比如 A1、A2、A3 是第一组,A4、A5、A6 是第二组,但不是 B1、B2、B3。如果可以根据因素的位置来做就更好了,我的意思是没有模式匹配
      • @user5240 那是另一种情况。在这种情况下,位置更好
      • 您知道按位置执行此操作的方法吗?阿克伦
      • @user5240 对于这些情况,只需 sapply(split.default(df[-1], rep(1:2, each = 3)), rowMeans)
      • 谢谢,它适用于我们有相同数量的复制的情况。有些措施只有 2 个,有些有 4 个重复。我的主要想法是从具有相同因子(条件)的处理中连接列(重复),然后通过因子来控制均值或标准差的计算。但可以想出一个正确的方法。你对此有什么想法或线索吗? @akrun
      猜你喜欢
      • 2017-07-18
      • 2019-01-22
      • 1970-01-01
      • 2019-08-26
      • 2021-11-10
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多