使用dplyr跨多列进行变异

5
我试图为多列计算逐行平均值。请问下面的代码为什么只计算代码中的两个变量(var_1和var_13)的平均值,而不是所有13个列的平均值?
df %>% 
rowwise() %>%
  mutate(varmean = mean(var_1:var_13)) -> df
1个回答

4

使用dplyr有两种可能性:

library(dplyr)

mtcars %>% 
  rowwise() %>% 
  mutate(varmean = mean(c_across(mpg:vs)))

这将返回

# A tibble: 32 x 12
# Rowwise: 
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb varmean
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>   <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4    40.0
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4    40.1
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1    31.7
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1    52.8
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2    73.2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1    47.7
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4    81.2
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2    33.1
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2    36.7
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4    42.8
# ... with 22 more rows

没有使用rowwise(),而是使用base RrowMeans()

mtcars %>% 
  mutate(varmean = rowMeans(across(mpg:vs)))

返回值

                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb  varmean
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 39.99750
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 40.09938
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1 31.69750
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 52.76687
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2 73.16375
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 47.69250
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 81.24000
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2 33.12250
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2 36.69625
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4 42.80750

太棒了,c_across在这个例子中表现得很好!谢谢。它能否用于您希望跨多列应用但它们不都相邻的情况,例如mpg:hp,wt:carb? - EvieeG
是的,只需用 c 包装它:mean(c_across(c(mpg:hp, wt:carb)) - Martin Gal
还有其他选择的可能性。比如取消选择一列,或者通过名称/字符串或索引进行匹配。 - Martin Gal
1
再次感谢你,Martin。现在你指出来了,这显然太明显了!谢谢。 - EvieeG

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