在mutate中使用整洁的评估函数,无需明确引用原始数据框

时间:2018-10-16 19:38:29

标签: r dplyr tidyeval

我想创建一个在mutate内部工作的函数。作为一个简单的例子,我可以使它起作用:

library(tidyverse)

# Toy Data
df <- tibble::tribble(
  ~id, ~first_name, ~gender, ~height,
  1,   "john",      "m",     71,
  2,   "jane",      "f",     64,
  3,   "sally",     "f",     65
)

double_it <- function(df, x) {
  x <- enquo(x)
  pull(df, !!x) * 2
}

df %>% mutate(height_2 = double_it(., height))

# A tibble: 3 x 5
     id first_name gender height height_2
  <dbl> <chr>      <chr>   <dbl>    <dbl>
1     1 john       m          71      142
2     2 jane       f          64      128
3     3 sally      f          65      130

但是,我想了解的是:

double_it <- function(x) {
  ???
}

df1 %>% mutate(height_2 = double_it(height))

# A tibble: 3 x 5
     id first_name gender height height_2
  <dbl> <chr>      <chr>   <dbl>    <dbl>
1     1 john       m          71      142
2     2 jane       f          64      128
3     3 sally      f          65      130

1 个答案:

答案 0 :(得分:1)

您可以使用.data$作为前缀:

library(tidyverse)

# Toy Data
df1 <- tibble::tribble(
  ~id, ~first_name, ~gender, ~height,
  1,   "john",      "m",     71,
  2,   "jane",      "f",     64,
  3,   "sally",     "f",     65
)

double_it <- function(x) {
  x * 2
}

df1 %>% mutate(height_2 = double_it(.data$height))
#> # A tibble: 3 x 5
#>      id first_name gender height height_2
#>   <dbl> <chr>      <chr>   <dbl>    <dbl>
#> 1     1 john       m          71      142
#> 2     2 jane       f          64      128
#> 3     3 sally      f          65      130

或直接使用height

double_it <- function(x) {
  x * 2
}

df1 %>% mutate(height_2 = double_it(height))
#> # A tibble: 3 x 5
#>      id first_name gender height height_2
#>   <dbl> <chr>      <chr>   <dbl>    <dbl>
#> 1     1 john       m          71      142
#> 2     2 jane       f          64      128
#> 3     3 sally      f          65      130