我的数据帧是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 ...
但每个月的平均值_年。在此先感谢您的帮助!
答案 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))))