【问题标题】:Using tidy evaluation function inside mutate without explicit reference to original dataframe在 mutate 中使用 tidy 评估函数而不显式引用原始数据帧
【发布时间】:2018-10-16 19:38:28
【问题描述】:

我想创建一个在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

【问题讨论】:

  • 所以你只想要double_it &lt;- function(x) {x*2}dplyr 可以使用mutate() 中的任何简单函数。
  • 这是一个不好的例子来证明我的问题。我要再试一次。
  • 看来只需要写一个普通的函数?
  • 谢谢,@lionel。你说的对。我尝试创建一个简单的示例,该示例与我尝试解决的问题相同。但是,我最终把它弄得太简单了。有时间我会发布一个更好的例子。

标签: r dplyr tidyeval


【解决方案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

【讨论】:

  • 谢谢,@Daniel。我的错,这实际上是我试图解决的真正问题的一个坏例子。我要编辑上面的代码。
猜你喜欢
  • 2014-05-19
  • 2020-08-29
  • 2022-09-23
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2019-07-02
  • 2022-11-02
相关资源
最近更新 更多