Начиная с dplyr
1.0, есть два способа приблизиться к этому:
- если вы хотите передать идентификатор столбца как простое выражение, как в вашем примере, используйте
{{x}}
- в качестве альтернативы вы можете передать его как вектор символов, а затем использовать
.data[[x]]
Я буду использовать первый подход, так как он ближе всего к тому, что вы собирались for.
Поскольку вы вычисляете одну и ту же сводку для всех трех фреймов данных, вашу функцию также можно сделать намного более краткой. Здесь я использую purrr::map_dfr
, чтобы применить функцию, которая суммирует один из ваших кадров данных ко всем трем кадрам данных, а затем привязывает результат к строке:
library(dplyr)
library(purrr)
set.seed(3046)
k1 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
k2 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
k3 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
numeric_var_summary <- function(k, col, na.rm = TRUE) {
k_summary <- k %>%
select(year, {{col}}) %>%
group_by(year) %>%
summarize(min = min({{col}}, na.rm = na.rm),
Q1 = quantile({{col}}, 0.25, na.rm = na.rm),
median = median({{col}}, na.rm = na.rm),
Q3 = quantile({{col}}, 0.75, na.rm = na.rm),
max = max({{col}}, na.rm = na.rm),
Qrange = quantile({{col}}, 0.75, na.rm = na.rm) - quantile({{col}}, 0.25, na.rm = na.rm),
mean = mean({{col}}, na.rm = na.rm),
sd = sd({{col}}, na.rm = na.rm),
n = n(),
missing = sum(is.na({{col}})))
return(k_summary)
}
# compute the individual summaries and combine the results
map_dfr(list(k1, k2, k3), numeric_var_summary, col = variable_name)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 18 x 11
#> year min Q1 median Q3 max Qrange mean sd n missing
#> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <int>
#> 1 1990 -1.18 -1.06 -0.553 0.312 2.72 1.37 -0.0309 1.38 9 0
#> 2 1991 -2.73 -0.775 -0.245 0.163 0.849 0.938 -0.471 0.954 18 0
#> 3 1992 -1.01 -0.176 0.354 0.735 2.75 0.911 0.344 0.849 21 0
#> 4 1993 -0.681 -0.247 -0.0524 0.567 1.99 0.814 0.256 0.799 14 0
#> 5 1994 -1.84 -1.08 -0.157 0.287 1.80 1.37 -0.280 0.948 18 0
#> 6 1995 -1.20 -0.573 -0.261 0.720 1.97 1.29 0.0397 0.881 20 0
#> 7 1990 -1.76 -0.397 0.283 0.534 1.29 0.931 0.0240 0.870 22 0
#> 8 1991 -2.24 -0.496 -0.112 0.372 1.29 0.868 -0.137 1.01 11 0
#> 9 1992 -1.44 -0.241 0.711 1.17 2.51 1.41 0.449 1.16 12 0
#> 10 1993 -1.92 -0.858 -0.210 0.770 2.31 1.63 -0.0219 1.11 22 0
#> 11 1994 -1.41 -0.207 0.485 0.870 2.23 1.08 0.332 0.987 14 0
#> 12 1995 -2.86 -0.374 0.300 1.05 2.35 1.43 0.221 1.24 19 0
#> 13 1990 -1.49 -1.03 -0.206 0.113 0.851 1.14 -0.292 0.722 14 0
#> 14 1991 -1.67 -0.454 0.139 0.514 1.82 0.968 0.0963 0.956 19 0
#> 15 1992 -2.11 -1.02 -0.217 0.569 1.10 1.59 -0.344 0.986 16 0
#> 16 1993 -1.58 -0.935 -0.0794 0.625 1.26 1.56 -0.160 0.946 10 0
#> 17 1994 -1.93 -0.494 -0.307 0.294 1.60 0.788 -0.186 0.902 22 0
#> 18 1995 -1.49 -0.751 0.374 0.900 2.19 1.65 0.229 1.10 19 0
# verify that the simplified function returns identical results:
numeric_var_summary_manual <- function(x) {
k1_x <- k1 %>%
select(year, {{x}}) %>%
group_by(year) %>%
summarize(min = min({{x}}), Q1 = quantile({{x}}, 0.25), median = median({{x}}),
Q3 = quantile({{x}}, 0.75), max = max({{x}}), Qrange = quantile({{x}}, 0.75) - quantile({{x}}, 0.25),
mean = mean({{x}}), sd = sd({{x}}), n = n(),
missing = sum(is.na({{x}})))
k2_x <- k2 %>%
select(year, {{x}}) %>%
group_by(year) %>%
summarize(min = min({{x}}), Q1 = quantile({{x}}, 0.25), median = median({{x}}),
Q3 = quantile({{x}}, 0.75), max = max({{x}}), Qrange = quantile({{x}}, 0.75) - quantile({{x}}, 0.25),
mean = mean({{x}}), sd = sd({{x}}), n = n(),
missing = sum(is.na({{x}})))
k3_x <- k3 %>%
select(year, {{x}}) %>%
group_by(year) %>%
summarize(min = min({{x}}), Q1 = quantile({{x}}, 0.25),
median = median({{x}}), Q3 = quantile({{x}}, 0.75),
max = max({{x}}), Qrange = quantile({{x}}, 0.75) - quantile({{x}}, 0.25),
mean = mean({{x}}), sd = sd({{x}}), n = n(),
missing = sum(is.na({{x}})))
return(bind_rows(k1_x, k2_x, k3_x))
}
identical(numeric_var_summary_manual(x = variable_name),
map_dfr(list(k1, k2, k3), numeric_var_summary, col = variable_name))
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> [1] TRUE