使用dplyr或基础R对多个/连续列进行变异

10

我正在尝试创建代表重复测量的变量的“波”。具体来说,我正在尝试创建连续的变量,表示变量1-10、11-20……91-100的平均值。请注意,“...”代表第3至9波的变量,因为避免输入这些变量是我的目标!

这里有一个包含10行和100列的示例数据框df

mat <- matrix(runif(1000, 1, 10), ncol = 100)
df <- data.frame(mat)
dim(df)
> 10 100

我使用了dplyr::mutate,它可以在所有变量被输入类型后运行,但会耗费时间且容易出错。我无法找到一种方法可以不手动键入列名来完成此操作,就像下面我开始做的那样(注意,“...”代表第三波至第九波):

df <- df %>% 
      mutate(wave_1 = (X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10) / 10,
             wave_2 = (X11 + X12 + X13 + X14 + X15 + X16 + X17 + X18 + X19 + X20) / 10,
             ...
             wave_10 = (X91 + X92 + X93 + X94 + X95 + X96 + X97 + X98 + X99 + X100) / 10)

你能否使用 'dplyr' 来同时/连续 修改 多个列?也欢迎其他方法。


1
需要使用dplyr吗? - Carlos Cinelli
不,谢谢 - 另外一个解决方案也很好。 - Joshua Rosenberg
5个回答

7

这里有一种使用zoo包的方法:

library(zoo)
t(rollapply(t(df), width = 10, by = 10, function(x) sum(x)/10))

以下是使用基本R的一种方法:

splits <- 1:100
dim(splits) <- c(10, 10)
splits <- split(splits, col(splits))
results <- do.call("cbind", lapply(splits, function(x) data.frame(rowSums(df[,x] / 10))))
names(results) <- paste0("wave_", 1:10)
results

另一种使用基本R的简洁方法(感谢G.Grothendieck):

t(apply(df, 1, tapply, gl(10, 10), mean))

这里有一个使用 dplyrtidyr 的解决方案:

library(dplyr)
library(tidyr)
df$row <- 1:nrow(df)
df2 <- df %>% gather(column, value, -row)
df2$column <- cut(as.numeric(gsub("X", "", df2$column)),breaks = c(0:10*10))
df2 <- df2 %>% group_by(row, column) %>% summarise(value = sum(value)/10)
df2 %>% spread(column, value) %>% select(-row)

谢谢,如果有人使用dplyr回答的话,我会等待的。 - Joshua Rosenberg
1
@JoshuaRosenberg 没问题,不用着急。 - Carlos Cinelli
@G.Grothendieck 很不错。 - Carlos Cinelli

3
我们也可以使用purrr::map2实现它:
library(purrr)

set.seed(123)
mat <- matrix(runif(1000, 1, 10), ncol = 100)
df <- data.frame(mat)

data.frame(from = seq(10, 100, 10) - 9, 
           to = seq(10, 100, 10)) %>%
  {map2_dfc(.$from, .$to, ~ rowMeans(df[, .x:.y]))} %>%
  set_names(paste0("Wave_", seq_along(.)))

# A tibble: 10 x 10
   Wave_1 Wave_2 Wave_3 Wave_4 Wave_5 Wave_6 Wave_7 Wave_8 Wave_9 Wave_10
    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
 1   5.57   6.59   5.75   5.79   6.28   5.67   5.96   6.58   4.37    6.39
 2   6.16   4.53   5.15   4.36   5.73   5.06   7.20   5.66   5.95    3.63
 3   5.94   5.62   4.66   6.65   5.21   6.84   4.98   4.39   6.32    7.42
 4   5.91   5.77   5.55   5.53   5.43   4.25   5.85   6.84   5.65    5.06
 5   4.74   6.04   4.34   4.65   5.65   5.95   4.26   5.31   6.88    6.19
 6   4.39   5.86   6.77   6.46   5.77   6.14   5.90   4.93   5.59    6.61
 7   5.85   5.53   4.88   6.19   5.39   5.13   6.72   4.85   4.96    6.00
 8   5.84   5.24   5.15   3.11   4.23   5.81   4.55   4.65   3.64    4.54
 9   5.63   5.65   4.18   3.94   3.89   7.15   5.78   5.49   4.59    5.55
10   4.83   5.46   7.32   7.62   6.10   4.71   4.00   4.91   5.75    4.03

同时在 基础 R 中,我们也可以这样做:

tmp <- split.default(df, ceiling(seq_along(df) / 10))  

as.data.frame(Reduce(function(x, y) {
  cbind(x, rowMeans(tmp[[y]]))
}, 2:length(tmp), init = rowMeans(tmp[[1]]))) |>
  setNames(paste0("wave_", 1:length(tmp)))

     wave_1   wave_2   wave_3   wave_4   wave_5   wave_6   wave_7   wave_8   wave_9  wave_10
1  5.571560 6.587021 5.750900 5.791688 6.279064 5.674091 5.963896 6.583146 4.365665 6.394814
2  6.164837 4.531540 5.153556 4.362311 5.727500 5.056182 7.197980 5.664657 5.947038 3.626209
3  5.937152 5.622390 4.660815 6.652186 5.209772 6.838960 4.977723 4.390910 6.320762 7.420729
4  5.910486 5.766074 5.549177 5.526093 5.434328 4.246362 5.853391 6.841727 5.652275 5.059860
5  4.735269 6.043003 4.335277 4.646320 5.650717 5.954178 4.260801 5.311500 6.884402 6.185179
6  4.391438 5.857648 6.766768 6.460810 5.773092 6.142438 5.902048 4.932962 5.590644 6.614198
7  5.854975 5.531683 4.882462 6.188551 5.390633 5.129840 6.715329 4.850971 4.957175 5.999634
8  5.838495 5.237646 5.145763 3.105511 4.234151 5.813252 4.553210 4.652256 3.637094 4.540835
9  5.632393 5.645221 4.176820 3.942658 3.885425 7.146875 5.778416 5.492009 4.589817 5.545992
10 4.833706 5.458013 7.323117 7.621194 6.100454 4.712570 4.003229 4.914826 5.752216 4.032089

2
另一个dplyr解决方案更接近OP所示的语法,不需要重新设置数据框架。
这4个波浪计算基本上是在稍微不同但矢量化(即rowSumsrowMeans)的方式下执行相同的操作。
df <- df %>% 
      mutate(wave_1 = rowSums(select(., num_range("X", 1:10)))/10,
             wave_2 = rowSums(select(., c(11:20)))/10,
             wave_3 = rowMeans(select(., X21:X30)),
             wave_4 = rowMeans(.[, 31:40]))

编辑: . 可以用作当前数据帧 df 的占位符(代码已相应更改)。此外,添加了 wave_4 以证明它可以像数据帧一样使用。

如果操作函数不是矢量化的(即,不能在整个数据帧上使用,如 rowSums),还可以利用 rowwisedo 函数来使用非矢量化函数(例如 myfun)。

myfun <- function (x) {
  sum(x)/10
}

tmp=df %>%
  rowwise() %>%
  do(data.frame(., wave_1 = myfun(unlist(.)[1:10]))) %>%
  do(data.frame(., wave_2 = myfun(unlist(.)[11:20])))

注意:. 的含义似乎会发生变化,对于 mutate 而言,它指的是整个数据框,而对于 do 而言,它只指当前行。

1
澄清后面的代码块:通过调用 do,您正在对原始数据帧的组进行操作,因此在该情况下,. 指的是每个组。rowwisegroup_by 的快捷方式,在此情况下,每行都是单独的一组,因此在 rowwise 之后,. 指的是每一行。 - camille

1
另一种方法来实现它。
set.seed(123)
mat <- matrix(runif(1000, 1, 10), ncol = 100)
df <- data.frame(mat)

library(tidyverse)

imap_dfc(split.default(df, (((as.numeric(gsub('X', '', names(df)))) -1) %/% 10) +1), 
         ~ .x %>% mutate(!!paste0('wave_', .y) := rowMeans(.)))

#>          X1       X2       X3       X4       X5       X6       X7       X8
#> 1  3.588198 9.611500 9.005854 9.667218 2.285200 1.412481 6.986037 7.790276
#> 2  8.094746 5.080007 7.235231 9.120691 4.730917 4.979801 1.853566 6.662990
#> 3  4.680792 7.098136 6.764561 7.216348 4.723519 8.190324 4.455727 7.391642
#> 4  8.947157 6.153701 9.948428 8.159207 4.319609 2.097093 3.469453 1.005623
#> 5  9.464206 1.926322 6.901352 1.221523 2.372003 6.048532 8.331760 5.277849
#> 6  1.410008 9.098425 7.376774 5.300164 2.249255 2.858783 5.036647 2.981070
#> 7  5.752949 3.214790 5.896594 7.826136 3.097307 2.147785 8.290579 4.418349
#> 8  9.031771 1.378536 6.347278 2.947671 5.193662 7.779771 8.311506 6.514939
#> 9  5.962915 3.951286 3.602438 3.863629 3.393754 9.055408 8.149081 4.166181
#> 10 5.109533 9.590533 2.324023 3.084632 8.720449 4.370165 4.958485 2.000219
#>          X9      X10   wave_1      X11      X12      X13      X14      X15
#> 1  3.192575 2.176261 5.571560 6.399901 9.417698 6.831041 6.573308 3.805320
#> 2  7.012500 6.877917 6.164837 3.995412 3.711060 3.878386 9.022547 4.685275
#> 3  4.758821 4.091648 5.937152 5.397517 1.546485 3.769480 7.056992 1.094204
#> 4  8.093763 6.910823 5.910486 9.590264 9.529542 2.977909 7.633700 2.654646
#> 5  1.925782 3.883359 4.735269 5.346122 7.485366 4.325400 5.690222 8.584564
#> 6  4.914035 2.689220 4.391438 9.013152 2.280649 9.857973 6.938546 3.080456
#> 7  9.864613 8.040649 5.854975 9.229944 5.943562 2.387821 8.396249 3.151900
#> 8  9.037460 1.842355 5.838495 6.478615 9.586821 1.819396 8.076534 1.690220
#> 9  8.978222 5.201011 5.632393 4.696208 6.269350 2.277162 9.818397 3.211513
#> 10 2.575474 5.603549 4.833706 2.323852 4.640593 7.210064 4.954884 7.589217
#>         X16      X17      X18      X19      X20   wave_2      X21      X22
#> 1  8.627078 5.520696 6.669757 8.557910 3.467500 6.587021 3.148534 5.338383
#> 2  5.477745 4.185141 2.654456 3.812033 3.893345 4.531540 9.661230 3.276684
#> 3  4.491181 6.849866 8.772797 7.374613 9.870768 5.622390 6.412292 2.946293
#> 4  3.218041 4.372426 7.719112 3.385160 6.579940 5.766074 5.635268 7.069387
#> 5  1.999868 4.199008 7.014562 6.349089 9.435827 6.043003 4.623160 1.428973
#> 6  4.509950 5.803192 6.562161 5.331608 5.198794 5.857648 8.922219 7.307678
#> 7  6.147418 7.663009 4.350143 3.385295 4.661493 5.531683 4.276827 4.166998
#> 8  2.952035 2.989926 5.768521 6.081314 6.933073 5.237646 3.594154 4.680496
#> 9  5.002912 4.714715 8.872141 9.218694 2.371120 5.645221 2.535807 8.388562
#> 10 2.961916 3.391180 6.235751 9.116870 6.155804 5.458013 2.549546 9.269716
#>         X23      X24      X25      X26      X27      X28      X29      X30
#> 1  3.542755 6.565161 5.921435 3.314951 9.331372 8.839391 7.827339 3.679676
#> 2  9.649943 4.855794 6.960859 2.996091 8.937798 1.056707 2.233955 1.906494
#> 3  7.555550 5.878723 2.545286 6.337411 7.067682 1.648514 4.569261 1.647137
#> 4  7.177376 1.526306 6.697498 3.407693 9.551503 2.477901 3.024868 8.923965
#> 5  1.475595 3.347712 3.806828 5.779634 5.648004 7.933007 1.521627 7.788227
#> 6  4.556981 4.574368 7.520989 8.067625 6.188671 7.616659 4.563034 8.349453
#> 7  5.300608 2.779703 4.590458 2.512547 4.026981 9.746881 1.584355 9.839263
#> 8  6.042279 8.487348 9.724208 4.639593 4.125922 5.198251 3.032978 1.932397
#> 9  7.284354 2.375985 9.706585 5.244186 1.180219 1.669461 1.491662 1.891376
#> 10 9.241152 8.230767 7.540323 8.812961 5.525317 6.839363 7.032538 8.189485
#>      wave_3      X31      X32      X33      X34      X35      X36      X37
#> 1  5.750900 8.061177 4.506284 8.683870 6.555117 4.732618 2.228862 2.294353
#> 2  5.153556 1.084869 5.181993 3.663059 3.576568 2.074643 9.707225 2.735344
#> 3  4.660815 8.011593 7.419511 2.323435 7.640177 5.734267 5.635646 9.070648
#> 4  5.549177 7.564516 1.497717 7.335929 8.506489 3.025660 2.467633 3.773076
#> 5  4.335277 6.671187 4.193048 1.934260 3.828437 5.377706 6.597121 4.269705
#> 6  6.766768 5.328197 8.225310 1.303550 5.433099 4.331933 9.873587 8.055518
#> 7  4.882462 2.409732 8.521380 9.994641 7.276364 9.850152 7.018944 2.740408
#> 8  5.145763 1.073940 3.139745 1.313873 6.773161 4.494872 4.770243 1.159892
#> 9  4.176820 5.072126 4.185875 4.045522 6.795306 3.063204 3.910105 4.659471
#> 10 7.323117 5.430640 8.711969 9.235574 9.800681 6.609678 8.517298 5.348509
#>         X38      X39      X40   wave_4      X41      X42      X43      X44
#> 1  4.796605 6.264101 9.793891 5.791688 9.874489 3.852543 5.927135 9.577911
#> 2  4.085279 7.847413 3.666720 4.362311 2.233607 8.484117 6.798162 6.072802
#> 3  8.798350 4.354385 7.533847 6.652186 9.147786 2.936549 6.366372 3.965927
#> 4  5.095972 7.922745 8.071191 5.526093 6.186717 5.481540 3.897436 9.969555
#> 5  5.803884 5.839095 1.948760 4.646320 4.559040 3.484447 9.020029 3.113377
#> 6  9.674590 9.225959 3.156352 6.460810 5.048222 2.728210 6.636313 6.514048
#> 7  7.971324 2.667668 3.434904 6.188551 7.358517 9.555591 3.726144 1.973607
#> 8  2.879887 3.539966 1.909526 3.105511 1.742525 3.895530 4.493842 5.383293
#> 9  3.779081 1.854662 2.061225 3.942658 4.053813 5.306107 2.444276 1.895012
#> 10 9.742082 2.894384 9.921129 7.621194 7.127088 1.251933 8.762967 2.450492
#>         X45      X46      X47      X48      X49      X50   wave_5      X51
#> 1  3.546936 5.714403 9.772532 1.845249 2.936498 9.742943 6.279064 4.182455
#> 2  6.254851 4.148216 4.925170 8.398271 8.325403 1.634401 5.727500 4.297973
#> 3  7.585369 3.164776 5.176150 4.846855 3.769875 5.138067 5.209772 3.583901
#> 4  2.489688 1.523726 2.487683 7.802985 7.189684 7.314266 5.434328 1.719756
#> 5  8.798210 3.129578 6.264429 6.961470 9.394130 1.782462 5.650717 4.289088
#> 6  7.377167 9.010701 3.437002 5.000747 2.042017 9.936496 5.773092 2.602124
#> 7  7.843596 8.306447 3.070872 6.644316 2.149351 3.277891 5.390633 5.824483
#> 8  2.323757 7.727647 7.220870 1.004188 7.104015 1.445846 4.234151 5.535538
#> 9  4.222513 2.394206 3.545672 2.955192 4.860537 7.176925 3.885425 9.505316
#> 10 7.059992 2.122679 8.293583 7.343850 8.509609 8.082346 6.100454 4.071892
#>         X52      X53      X54      X55      X56      X57      X58      X59
#> 1  5.182424 3.710283 9.452246 8.208534 3.948377 1.429390 5.979826 8.908066
#> 2  1.742781 4.282039 7.188468 1.824802 2.844448 9.364156 9.154433 8.315674
#> 3  8.740962 3.809015 5.023333 8.488970 6.124444 7.923570 6.287152 8.686900
#> 4  4.560946 1.336330 8.348303 3.491696 8.992497 2.809726 4.811173 4.311064
#> 5  7.623094 5.669244 1.355493 7.777991 5.767427 6.852354 9.546268 8.865549
#> 6  2.545691 7.111121 7.651285 9.677373 6.282628 6.883900 7.381341 2.362044
#> 7  5.092855 9.129102 4.138475 1.733199 6.991616 4.557284 4.719749 3.536305
#> 8  7.931843 1.229740 8.463257 8.689283 5.769032 8.310743 1.165277 7.000346
#> 9  1.563850 9.901704 5.819873 8.220144 5.588586 5.923211 6.100607 9.796452
#> 10 8.335733 3.725989 3.470908 4.466562 1.145444 8.966194 5.410571 6.244658
#>         X60   wave_6      X61      X62      X63      X64      X65      X66
#> 1  5.739311 5.674091 3.135067 6.667709 9.130608 7.832218 6.344546 7.776389
#> 2  1.547040 5.056182 7.178413 1.869704 8.789507 8.603512 8.189412 9.253514
#> 3  9.721350 6.838960 3.032366 1.197943 7.978668 5.121294 8.995678 5.281755
#> 4  2.082134 4.246362 3.866451 9.937403 4.391348 7.566685 4.466724 6.104075
#> 5  1.795270 5.954178 2.565854 6.255450 1.378972 1.936708 1.812899 7.629583
#> 6  8.926877 6.142438 8.212866 8.036408 4.279700 2.979849 6.631693 8.717027
#> 7  5.575336 5.129840 2.316539 9.027065 3.463761 9.585561 7.710726 9.182319
#> 8  4.037455 5.813252 8.404457 7.793789 8.654207 7.768338 1.768406 1.507440
#> 9  9.049012 7.146875 3.978980 9.812834 4.261615 8.370598 3.704659 5.526175
#> 10 1.287745 4.712570 4.367524 1.397324 3.740300 4.759994 6.531059 4.154903
#>         X67      X68      X69      X70   wave_7      X71      X72      X73
#> 1  8.610005 1.180666 7.603730 1.358026 5.963896 8.604402 6.676962 4.768022
#> 2  8.257916 5.691825 7.432793 6.713205 7.197980 3.341192 5.687581 7.460961
#> 3  2.055981 1.776501 8.480998 5.856048 4.977723 1.208300 6.936592 7.682852
#> 4  7.414179 3.547021 8.979095 2.260932 5.853391 8.761596 7.564248 8.847989
#> 5  3.117420 4.783914 9.573801 3.553406 4.260801 4.011292 5.381406 6.470812
#> 6  1.674611 6.285503 5.955550 6.247275 5.902048 6.686100 4.460110 7.805830
#> 7  9.420815 8.260250 5.701022 2.485233 6.715329 5.917836 1.061502 8.625172
#> 8  2.414510 2.817957 2.536284 1.866710 4.553210 4.388000 1.033158 6.515017
#> 9  6.823516 5.134822 5.313444 4.857518 5.778416 2.672857 9.954428 8.139018
#> 10 2.561660 5.033288 3.284387 4.201854 4.003229 4.860465 1.970982 1.205692
#>         X74      X75      X76      X77      X78      X79      X80   wave_8
#> 1  4.752231 9.929536 3.499924 5.624030 9.243877 3.329211 9.403269 6.583146
#> 2  8.873941 2.335172 3.244659 3.127059 8.318018 8.375204 5.882785 5.664657
#> 3  6.826123 1.444279 2.434919 6.178921 7.083010 1.139299 2.974803 4.390910
#> 4  9.320311 6.376181 1.644671 5.340321 8.267492 6.889607 5.404850 6.841727
#> 5  2.550026 3.891956 6.016938 6.124174 2.152580 8.305476 8.210339 5.311500
#> 6  3.842315 5.751361 5.408533 2.297371 3.257007 5.152320 4.668676 4.932962
#> 7  8.238307 8.158798 5.448631 2.311379 3.983923 2.830754 1.933404 4.850971
#> 8  9.900671 1.620393 8.995344 4.710548 4.665424 1.168914 3.525087 4.652256
#> 9  3.901470 7.255186 1.330339 7.147093 6.718308 3.548194 4.253196 5.492009
#> 10 1.010725 9.537684 2.833694 6.880850 8.277508 9.237454 3.333204 4.914826
#>         X81      X82      X83      X84      X85      X86      X87      X88
#> 1  5.236137 1.444740 7.198490 1.036962 9.661792 3.936098 4.820069 2.265816
#> 2  4.292609 7.255947 3.801437 7.947185 7.627006 7.537590 1.381246 2.527921
#> 3  2.091448 4.269354 6.450282 5.166777 6.514511 9.925707 6.826979 7.857868
#> 4  1.422943 8.957202 9.919309 7.487563 2.079360 7.436202 5.217572 5.746554
#> 5  3.365167 7.977675 7.688844 6.998551 5.952331 5.539958 6.561335 8.748904
#> 6  9.717771 2.252833 1.682714 6.148663 3.364807 4.924429 3.437339 7.061995
#> 7  5.396459 3.655083 5.060520 7.334317 9.085247 9.539427 2.415658 1.117369
#> 8  5.300398 2.134745 1.481832 6.914990 1.082620 2.081633 2.028288 7.238790
#> 9  7.739136 6.309115 4.056000 3.604169 3.126114 1.676307 5.569146 9.025424
#> 10 7.008762 6.055080 7.605569 1.875155 2.170401 9.001193 5.932291 6.686652
#>         X89      X90   wave_9      X91      X92      X93      X94      X95
#> 1  1.965652 6.090889 4.365665 9.313293 1.035067 8.275476 8.981763 9.783007
#> 2  9.289587 7.809851 5.947038 5.883385 1.469788 1.377275 2.836863 5.412018
#> 3  7.078261 7.026432 6.320762 8.671281 8.799042 4.273684 7.935607 4.502533
#> 4  2.337343 5.918705 5.652275 6.252066 6.186207 8.709373 6.367267 4.757995
#> 5  7.708077 8.303173 6.884402 7.014913 3.824583 7.281519 9.619028 1.836332
#> 6  9.483390 7.832501 5.590644 5.601831 9.635192 7.160378 2.428196 2.456283
#> 7  4.787050 1.180616 4.957175 7.864755 6.320744 4.132135 5.733768 4.648748
#> 8  3.679508 4.428133 3.637094 9.130261 5.782684 5.992136 8.858362 4.076330
#> 9  3.334840 1.457921 4.589817 8.384271 4.455430 2.235193 8.827355 4.737317
#> 10 3.005932 8.181126 5.752216 1.642887 3.875979 8.064384 1.213198 3.736472
#>         X96      X97      X98      X99     X100  wave_10
#> 1  6.042525 5.573423 8.037720 5.120891 1.784974 6.394814
#> 2  2.402867 5.046399 1.414239 7.405233 3.014020 3.626209
#> 3  9.609218 6.609352 8.378602 9.278633 6.149338 7.420729
#> 4  1.395700 2.259801 3.424676 6.643996 4.601523 5.059860
#> 5  4.349420 9.171518 3.545654 9.119636 6.089188 6.185179
#> 6  9.663538 6.124989 6.788994 7.815962 8.466615 6.614198
#> 7  6.808848 5.934525 9.533070 2.240725 6.779024 5.999634
#> 8  1.551364 2.051449 1.062986 2.379294 4.523489 4.540835
#> 9  4.689513 7.858255 4.164559 2.721810 7.386219 5.545992
#> 10 4.833146 5.305325 4.771412 4.898666 1.979417 4.032089

本文内容创建于2021年7月24日,使用reprex package (v2.0.0)。


1
另一种方法(我个人推荐的方法)是使用dplyr,在汇总每个波浪的值之前先将数据重塑或融合为整洁数据格式
具体来说,这个过程包括:
  1. 将数据重塑为长格式(tidyr::gather
  2. 确定哪些变量属于每个“波浪”
  3. 汇总每个波浪的值
  4. 将数据重新重塑为宽格式(tidyr::spread
在您的示例中,这将如下所示:
library(tidyverse)

mat <- matrix(runif(1000, 1, 10), ncol = 100)
df <- data.frame(mat)
dim(df)

df %>%
  dplyr::mutate(id = dplyr::row_number()) %>%
  # reshape to "tidy data" or long format
  tidyr::gather(varname, value, -id) %>%
  # identify which variables belong to which "wave"
  dplyr::mutate(varnum = as.integer(stringr::str_extract(varname, pattern = '\\d+')),
                wave = floor((varnum-1)/10)+1) %>%
  # summarize your value for each wave
  dplyr::group_by(id, wave) %>%
  dplyr::summarise(avg = sum(value)/n()) %>%
  # reshape back to "wide" format
  tidyr::spread(wave, avg, sep='_') %>%
  dplyr::ungroup()

以下是输出结果:

# A tibble: 10 x 11
      id wave_1 wave_2 wave_3 wave_4 wave_5 wave_6 wave_7 wave_8 wave_9 wave_10
   <int>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
 1     1   6.24   4.49   5.85   5.43   5.98   6.04   4.83   6.92   5.43    5.52
 2     2   5.16   6.82   5.76   6.66   6.21   5.41   4.58   5.06   5.81    6.93
 3     3   7.23   6.28   5.40   5.70   5.13   6.27   5.55   5.84   6.74    5.94
 4     4   5.27   4.79   4.39   6.85   5.31   6.01   6.15   3.31   5.73    5.63
 5     5   6.48   5.16   5.20   4.71   5.87   4.44   6.40   5.00   5.90    3.78
 6     6   4.18   4.64   5.49   5.47   5.75   6.35   4.34   5.66   5.34    6.57
 7     7   4.97   4.09   6.17   5.78   5.87   6.47   4.96   4.39   5.99    5.35
 8     8   5.50   7.21   5.43   5.15   4.56   5.00   4.86   5.72   6.41    5.65
 9     9   5.27   5.71   5.23   5.44   5.12   5.40   5.38   6.05   5.41    5.30
10    10   5.95   4.58   6.52   5.46   7.63   5.56   5.82   7.03   5.68    5.38

这可以与原始数据连接起来,以匹配您给出的示例(使用 mutate)如下:

df %>%
  dplyr::mutate(id = dplyr::row_number()) %>%
  tidyr::gather(varname, value, -id) %>%
  dplyr::mutate(varnum = as.integer(stringr::str_extract(varname, pattern = '\\d+')),
                wave = floor((varnum-1)/10)+1) %>%
  dplyr::group_by(id, wave) %>%
  dplyr::summarise(avg = sum(value)/n()) %>%
  tidyr::spread(wave, avg, sep='_') %>%
  dplyr::ungroup() %>%
  dplyr::right_join(df %>%    # <-- join back to original data
                     dplyr::mutate(id = dplyr::row_number()),
                   by = 'id')

这种方法的一个好处是可以检查数据,以确认正确地将变量分配给“wave”。
df %>%
  dplyr::mutate(id = dplyr::row_number()) %>%
  tidyr::gather(varname, value, -id) %>%
  dplyr::mutate(varnum = as.integer(stringr::str_extract(varname, pattern = '\\d+')),
                wave = floor((varnum-1)/10)+1) %>%
  dplyr::distinct(varname, varnum, wave) %>%
  head()

它会产生:

  varname varnum wave
1      X1      1    1
2      X2      2    1
3      X3      3    1
4      X4      4    1
5      X5      5    1
6      X6      6    1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接