library(dplyr)
我们将Variables分为三类:
$
才能调用的在函数中使用data-variables,要加{{}}
:
var_summary <- function(data, var){
data %>%
summarise(n = n(), min = min({{var}}), max = max({{var}}))
}
mtcars %>%
group_by(cyl) %>%
var_summary(mpg)
## # A tibble: 3 × 4
## cyl n min max
## <dbl> <int> <dbl> <dbl>
## 1 4 11 21.4 33.9
## 2 6 7 17.8 21.4
## 3 8 14 10.4 19.2
在函数中使用character,要加.data[[]]
:
var_summary <- function(data, var){
data %>%
summarise(n = n(), min = min(.data[[var]]), max = max(.data[[var]]))
}
mtcars %>%
group_by(cyl) %>%
var_summary("mpg")
## # A tibble: 3 × 4
## cyl n min max
## <dbl> <int> <dbl> <dbl>
## 1 4 11 21.4 33.9
## 2 6 7 17.8 21.4
## 3 8 14 10.4 19.2
对于data-variables:
summarise_mean <- function(data, vars) {
data %>% summarise(n = n(), across({{ vars }}, mean))
}
mtcars %>%
group_by(cyl) %>%
summarise_mean(where(is.numeric)) # 对所有数值变量进行选择
## # A tibble: 3 × 12
## cyl n mpg disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4 11 26.7 105. 82.6 4.07 2.29 19.1 0.909 0.727 4.09 1.55
## 2 6 7 19.7 183. 122. 3.59 3.12 18.0 0.571 0.429 3.86 3.43
## 3 8 14 15.1 353. 209. 3.23 4.00 16.8 0 0.143 3.29 3.5
mtcars %>%
summarise_mean(1:3) # 对1到3列的变量进行选择
## n mpg cyl disp
## 1 32 20.09062 6.1875 230.7219
mtcars %>%
summarise_mean(c(cyl, disp, mpg)) # 对这三个变量进行选择
## n cyl disp mpg
## 1 32 6.1875 230.7219 20.09062
对于character,加一个all_of
就可以:
vars <- c("mpg", "vs")
mtcars %>% select(all_of(vars)) %>% head()
## mpg vs
## Mazda RX4 21.0 0
## Mazda RX4 Wag 21.0 0
## Datsun 710 22.8 1
## Hornet 4 Drive 21.4 1
## Hornet Sportabout 18.7 0
## Valiant 18.1 1
mtcars %>% select(!all_of(vars)) %>% head() # !是反向选择
## cyl disp hp drat wt qsec am gear carb
## Mazda RX4 6 160 110 3.90 2.620 16.46 1 4 4
## Mazda RX4 Wag 6 160 110 3.90 2.875 17.02 1 4 4
## Datsun 710 4 108 93 3.85 2.320 18.61 1 4 1
## Hornet 4 Drive 6 258 110 3.08 3.215 19.44 0 3 1
## Hornet Sportabout 8 360 175 3.15 3.440 17.02 0 3 2
## Valiant 6 225 105 2.76 3.460 20.22 0 3 1