首页 > 解决方案 > R - 是否有一种简洁的方法可以为长数据帧中的每个组获取折刀平均值

问题描述

使用 mtcars 数据集,我现在有一个函数可以为 mpg 创建一个折刀平均值。

data(mtcars)

for (i in 1:nrow(mtcars)) {
  mtcars_minus_one <- mtcars[-i,]
  mean_value_minus_one = mean(mtcars_minus_one$mpg)
  mtcars$jackknife_mean_mpg[i] <- mean_value_minus_one
}


ggplot(mtcars, aes(x = jackknife_mean_mpg)) + 
  geom_histogram(bins = 32, color = 'black', fill = 'lightblue')

我也有一个很长的数据框。

mtcars <- as_tibble(mtcars, rownames = 'car')

mtcars_numeric <- mtcars %>%
  dplyr::select(car, mpg, disp, hp, drat, wt, qsec) 

mtcars_long_numeric <- pivot_longer(mtcars_numeric, names_to = 'names', values_to = 'values', 2:7)

有没有一种简洁的方法可以为每个组创建一个折刀列?我只知道如何使用这个函数来做这个折刀——我想知道是否有一种 dplyr 方法可以做到这一点而不必运行该函数六次。

标签: rtidyverse

解决方案


我们可以循环across感兴趣的列,即'mpg','disp','hp',然后循环遍历行序列map,删除对应于该序列索引(x[-rn])的观察,获取mean并返回它,创建新列利用.names

library(dplyr)
library(purrr)
mtcars_numeric %>% 
    mutate(across(c(mpg, disp, hp), function(x) 
       map_dbl(seq_along(x), function(rn) mean(x[-rn])), 
          .names = "{.col}_mean"))

-输出

 carb  mpg  disp  hp drat    wt  qsec mpg_mean disp_mean  hp_mean
1     4 21.0 160.0 110 3.90 2.620 16.46 20.06129  233.0032 147.8710
2     4 21.0 160.0 110 3.90 2.875 17.02 20.06129  233.0032 147.8710
3     1 22.8 108.0  93 3.85 2.320 18.61 20.00323  234.6806 148.4194
4     1 21.4 258.0 110 3.08 3.215 19.44 20.04839  229.8419 147.8710
5     2 18.7 360.0 175 3.15 3.440 17.02 20.13548  226.5516 145.7742
6     1 18.1 225.0 105 2.76 3.460 20.22 20.15484  230.9065 148.0323
7     4 14.3 360.0 245 3.21 3.570 15.84 20.27742  226.5516 143.5161
8     2 24.4 146.7  62 3.69 3.190 20.00 19.95161  233.4323 149.4194
9     2 22.8 140.8  95 3.92 3.150 22.90 20.00323  233.6226 148.3548
10    4 19.2 167.6 123 3.92 3.440 18.30 20.11935  232.7581 147.4516
11    4 17.8 167.6 123 3.92 3.440 18.90 20.16452  232.7581 147.4516
12    3 16.4 275.8 180 3.07 4.070 17.40 20.20968  229.2677 145.6129
13    3 17.3 275.8 180 3.07 3.730 17.60 20.18065  229.2677 145.6129
14    3 15.2 275.8 180 3.07 3.780 18.00 20.24839  229.2677 145.6129
15    4 10.4 472.0 205 2.93 5.250 17.98 20.40323  222.9387 144.8065
16    4 10.4 460.0 215 3.00 5.424 17.82 20.40323  223.3258 144.4839
17    4 14.7 440.0 230 3.23 5.345 17.42 20.26452  223.9710 144.0000
18    1 32.4  78.7  66 4.08 2.200 19.47 19.69355  235.6258 149.2903
19    2 30.4  75.7  52 4.93 1.615 18.52 19.75806  235.7226 149.7419
20    1 33.9  71.1  65 4.22 1.835 19.90 19.64516  235.8710 149.3226
21    1 21.5 120.1  97 3.70 2.465 20.01 20.04516  234.2903 148.2903
22    2 15.5 318.0 150 2.76 3.520 16.87 20.23871  227.9065 146.5806
23    2 15.2 304.0 150 3.15 3.435 17.30 20.24839  228.3581 146.5806
24    4 13.3 350.0 245 3.73 3.840 15.41 20.30968  226.8742 143.5161
25    2 19.2 400.0 175 3.08 3.845 17.05 20.11935  225.2613 145.7742
26    1 27.3  79.0  66 4.08 1.935 18.90 19.85806  235.6161 149.2903
27    2 26.0 120.3  91 4.43 2.140 16.70 19.90000  234.2839 148.4839
28    2 30.4  95.1 113 3.77 1.513 16.90 19.75806  235.0968 147.7742
29    4 15.8 351.0 264 4.22 3.170 14.50 20.22903  226.8419 142.9032
30    6 19.7 145.0 175 3.62 2.770 15.50 20.10323  233.4871 145.7742
31    8 15.0 301.0 335 3.54 3.570 14.60 20.25484  228.4548 140.6129
32    2 21.4 121.0 109 4.11 2.780 18.60 20.04839  234.2613 147.9032

推荐阅读