【问题标题】:Averaging rows by columns with the same name按具有相同名称的列平均行
【发布时间】:2015-12-08 21:57:22
【问题描述】:

我有一个 130 行 x 1321 列的数据框。大多数列名是 Month_Year 的组合(即 1_89、3_00 等)。有 2-5 列具有相同的名称。我想对具有相同名称的列中的行中的值进行平均。这是我的 df 结构:

    'data.frame':   130 obs. of  1321 variables:
    $ StationID: int  15 90 91 27 77 72 43 53 67 127 ...
    $ X        : num  -125 -124 -124 -124 -124 ...
    $ Y        : num  42.8 40.7 40.7 40.6 40.9 ...
    $ 1_89     : num  101 100 100 100 100 ...
    $ 1_89     : num  95.8 97.2 97.2 100 99 ...
    $ 1_89     : num  137 159 159 175 168 ...
    $ 1_89     : num  141 171 171 180 178 ...
    $ 1_89     : num  106 112 112 113 111 ...
    $ 2_89     : num  140 165 165 171 172 ...
    $ 2_89     : num  109 133 133 147 137 ...
    $ 2_89     : num  140 179 179 174 173 ...
    $ 2_89     : num  126 130 130 118 130 ...
    $ 3_89     : int  0 0 0 0 0 0 0 0 0 0 ...
    $ 3_89     : num  100 104 104 100 100 ...
    $ 3_89     : int  0 0 0 0 0 0 0 0 0 0 ...
    $ 3_89     : num  112 173 173 173 168 ...
    $ 4_89     : num  125 175 175 176 170 ...
    $ 4_89     : num  104 166 166 161 161 ...
    $ 4_89     : num  0 0 0 0 0 0 0 0 0 0 ...

我知道这对于数据帧来说是一种非常不寻常的结构,但我想将其转换为如下所示的数据帧:

    $ StationID: int  15 90 91 27 77 72 43 53 67 127 ...
    $ X        : num  -125 -124 -124 -124 -124 ...
    $ Y        : num  42.8 40.7 40.7 40.6 40.9 ...
    $ 1_89     : num  101 100 100 100 100 ...
    $ 2_89     : num  109 133 133 147 137 ...
    $ 3_89     : num  100 104 104 100 100 ...
    $ 4_89     : num  104 166 166 161 161 ...

但每个 Month_Year 的平均值。提前感谢您的帮助!

【问题讨论】:

  • 请务必通过dput 提供样本数据。数据结构很难重构。

标签: r average multiple-columns


【解决方案1】:

您可以找到唯一的列名,然后遍历每个列,计算这些列的平均值

创建一些数据

set.seed(1)
dat <- setNames(data.frame(replicate(10, rnorm(5))) ,
                                        paste0("var", rep(1:3, c(3,2,5))))

head(dat, 3)
#            var1       var1       var1        var2       var2        #var3       var3       var3
#    1 -0.6264538 -0.8204684  1.5117812 -0.04493361 0.91897737 -0.05612874  #1.3586796 -0.4149946
#    2  0.1836433  0.4874291  0.3898432 -0.01619026 0.78213630 -0.15579551 #-0.1027877 -0.3942900
#    3 -0.8356286  0.7383247 -0.6212406  0.94383621 0.07456498 -1.47075238  #0.3876716 -0.0593134

#            var3       var3
#    1 -0.1645236 -0.7074952
#    2 -0.2533617  0.3645820
#    3  0.6969634  0.7685329

提取唯一名称

nms <- unique(names(dat))

平均同名列

sapply(nms, function(x)  rowMeans(dat[names(dat) %in% x]))
#            var1       var2          var3
#[1,]  0.02161966  0.4370219  0.0031074991
#[2,]  0.35363854  0.3829730 -0.1083305812
#[3,] -0.23951483  0.5092006  0.0646204262
#[4,] -0.01454591 -0.5840653  0.2024774526
#[5,]  0.38301677  0.6068635 -0.0007180433

对于较大的数据,这可能会更快一些

t(rowsum(t(dat), names(dat))/c(table(names(dat))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2021-02-13
    • 1970-01-01
    • 2023-01-11
    • 2022-01-08
    相关资源
    最近更新 更多