【问题标题】:Means for each row by groups of columns, loop表示每行按列组,循环
【发布时间】:2020-01-30 10:23:50
【问题描述】:

我需要为每组列的数据中的每一行计算平均值,所以我想为它使用一个循环,因为我的日期维度约为 500 000x1000。 我的数据看起来像这样:

        var a1 var a2 var b1 var b2 var c1 var c2 var d1 var d2 var e1 var e2
 [1,]      7      9      9      8      3      5      1      1      7      8
 [2,]      3      9      9      9      6      6      8      1      9      5
 [3,]      7      8     10      8      7      5      2      3      9      7
 [4,]      5     10      7      4      6      1      6      1      9      3

我可以用这种方式计算平均值,而且效果很好,但我有大约 200 个组

rowMeans(x[,1:2])

如何为 rowMeans 创建一个循环来计算每组列的平均值,例如“var a”、“var b”等。 我是 R 新手,非常感谢任何帮助。

【问题讨论】:

    标签: r loops mean


    【解决方案1】:

    我们可以使用split.default根据常用列名拆分列,然后取每个列表的rowMeans

    sapply(split.default(data.frame(x), sub("var(.)\\d+", "\\1",colnames(x))), rowMeans)
    
    #       a   b   c   d   e
    #[1,] 8.0 8.5 4.0 1.0 7.5
    #[2,] 6.0 9.0 6.0 4.5 7.0
    #[3,] 7.5 9.0 6.0 2.5 8.0
    #[4,] 7.5 5.5 3.5 3.5 6.0
    

    在哪里

    sub("var(.)\\d+", "\\1",colnames(x)) #returns
    #[1] "a" "a" "b" "b" "c" "c" "d" "d" "e" "e"
    

    数据

    假设x 是一个矩阵。

    x <- structure(c(7L, 3L, 7L, 5L, 9L, 9L, 8L, 10L, 9L, 9L, 10L, 7L, 
    8L, 9L, 8L, 4L, 3L, 6L, 7L, 6L, 5L, 6L, 5L, 1L, 1L, 8L, 2L, 6L, 
    1L, 1L, 3L, 1L, 7L, 9L, 9L, 9L, 8L, 5L, 7L, 3L), .Dim = c(4L, 
    10L), .Dimnames = list(NULL, c("vara1", "vara2", "varb1", "varb2", 
    "varc1", "varc2", "vard1", "vard2", "vare1", "vare2")))
    

    【讨论】:

    • 这正是我想要的!非常感谢
    【解决方案2】:

    这是一个使用 3 维数组的解决方案:

    x <- read.table(text=
    " 7      9      9      8      3      5      1      1      7      8
      3      9      9      9      6      6      8      1      9      5
      7      8     10      8      7      5      2      3      9      7
      5     10      7      4      6      1      6      1      9      3")
    
    x <- as.matrix(x)
    apply(array(x, dim=c(4, 2, ncol(x)/2)), c(1,3), mean)
    # > apply(array(x, dim=c(4, 2, ncol(x)/2)), c(1,3), mean)
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]  8.0  8.5  4.0  1.0  7.5
    # [2,]  6.0  9.0  6.0  4.5  7.0
    # [3,]  7.5  9.0  6.0  2.5  8.0
    # [4,]  7.5  5.5  3.5  3.5  6.0
    

    为了生成漂亮的列名,您可以这样做(类似于 @Ronak 的解决方案):

    x <- as.matrix(x)
    colnames(x) <- c("vara1", "vara2", "varb1", "varb2", "varc1", "varc2", "vard1", "vard2", "vare1", "vare2") # original colnames
    y <- apply(array(x, dim=c(4, 2, ncol(x)/2)), c(1,3), mean)
    cn <- colnames(x)[c(TRUE, FALSE)]
    colnames(y) <- sub("var(.*)\\d+", "\\1", cn)
    y
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多