按名称对列进行行平均

时间:2015-12-08 21:57:23

标签: r average multiple-columns

我的数据帧是130行乘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 ...

但每个月的平均值_年。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

创建一些数据

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))))