使用 tidyeval 编程:tidyr::unite(col = !!col) 之后的 mutate 函数
Programming with tidyeval: The mutate function after tidyr::unite(col = !!col)
所以我想用 tidyr 的 unite()
创建一个函数,但它似乎不起作用..
library(dplyr, warn.conflicts = FALSE)
library(tidyr, warn.conflicts = FALSE)
library(stringr, warn.conflicts = FALSE)
mtcars %>%
as_tibble() %>%
select(mpg , cyl) %>%
mutate_all(as.character) %>%
unite(col = hello, sep = "/") %>%
mutate(hello = str_replace(hello, "/", ""))
#> # A tibble: 32 x 1
#> hello
#> <chr>
#> 1 216
#> 2 216
#> 3 22.84
#> 4 21.46
#> 5 18.78
#> 6 18.16
#> 7 14.38
#> 8 24.44
#> 9 22.84
#> 10 19.26
#> # ... with 22 more rows
# Now I want to make it a function where I choose the colomn name i unite()
unite_fun <- function(df, var1 = mpg, var2 = cyl, col_name = hello){
var1 <- enquo(var1)
var2 <- enquo(var2)
col_name <- enquo(col_name)
mtcars %>%
as_tibble() %>%
select(!!var1 , !!var2) %>%
mutate_all(as.character) %>%
unite(col = !!col_name, sep = "/") %>%
mutate(col_name = str_replace(col_name, "/", "")) # how do I refer to col_name here in mutate
}
由 reprex package (v0.3.0)
于 2019-07-12 创建
如何在 mutate 中使用我在 unite 中选择的列名?
我不确定这是否是最好的方法,但一个选择是使用 quo_name
在 mutate
中引用它
library(tidyverse)
library(rlang)
unite_fun <- function(df, var1 = mpg, var2 = cyl, col_name = hello){
var1 <- enquo(var1)
var2 <- enquo(var2)
col_name <- enquo(col_name)
col1_name <- quo_name(col_name)
mtcars %>%
as_tibble() %>%
select(!!var1 , !!var2) %>%
mutate_all(as.character) %>%
unite(col = !!col_name, sep = "/") %>%
mutate(!!col1_name := str_replace(!!col_name, "/", ""))
}
unite_fun(mtcars, mpg, cyl)
# A tibble: 32 x 1
# hello
# <chr>
# 1 216
# 2 216
# 3 22.84
# 4 21.46
# 5 18.78
# 6 18.16
# 7 14.38
# 8 24.44
# 9 22.84
#10 19.26
# … with 22 more rows
我们可以利用 rlang -0.4.0
中的 {{..}}
- curly-curly 运算符,它应该可以更轻松地进行评估
library(dplyr)
library(rlang)
library(tidyr)
unite_fun <- function(df, var1, var2, col_name = hello){
df %>%
as_tibble() %>%
select({{var1}} , {{var2}}) %>%
mutate_all(as.character) %>%
unite(col = {{col_name}}, sep = "")
}
unite_fun(mtcars, mpg, cyl)
# A tibble: 32 x 1
# hello
# <chr>
# 1 216
# 2 216
# 3 22.84
# 4 21.46
# 5 18.78
# 6 18.16
# 7 14.38
# 8 24.44
# 9 22.84
#10 19.26
# … with 22 more rows
如果我们需要在最后使用mutate
步骤
unite_fun <- function(df, var1, var2, col_name = hello){
df %>%
as_tibble() %>%
select({{var1}} , {{var2}}) %>%
mutate_all(as.character) %>%
unite(col = {{col_name}}, sep = "/") %>%
mutate_at(1, ~ str_replace(., "/", ""))
}
unite_fun(mtcars, mpg, cyl)
# A tibble: 32 x 1
# hello
# <chr>
# 1 216
# 2 216
# 3 22.84
# 4 21.46
# 5 18.78
# 6 18.16
# 7 14.38
# 8 24.44
# 9 22.84
#10 19.26
# … with 22 more rows
所以我想用 tidyr 的 unite()
创建一个函数,但它似乎不起作用..
library(dplyr, warn.conflicts = FALSE)
library(tidyr, warn.conflicts = FALSE)
library(stringr, warn.conflicts = FALSE)
mtcars %>%
as_tibble() %>%
select(mpg , cyl) %>%
mutate_all(as.character) %>%
unite(col = hello, sep = "/") %>%
mutate(hello = str_replace(hello, "/", ""))
#> # A tibble: 32 x 1
#> hello
#> <chr>
#> 1 216
#> 2 216
#> 3 22.84
#> 4 21.46
#> 5 18.78
#> 6 18.16
#> 7 14.38
#> 8 24.44
#> 9 22.84
#> 10 19.26
#> # ... with 22 more rows
# Now I want to make it a function where I choose the colomn name i unite()
unite_fun <- function(df, var1 = mpg, var2 = cyl, col_name = hello){
var1 <- enquo(var1)
var2 <- enquo(var2)
col_name <- enquo(col_name)
mtcars %>%
as_tibble() %>%
select(!!var1 , !!var2) %>%
mutate_all(as.character) %>%
unite(col = !!col_name, sep = "/") %>%
mutate(col_name = str_replace(col_name, "/", "")) # how do I refer to col_name here in mutate
}
由 reprex package (v0.3.0)
于 2019-07-12 创建如何在 mutate 中使用我在 unite 中选择的列名?
我不确定这是否是最好的方法,但一个选择是使用 quo_name
在 mutate
library(tidyverse)
library(rlang)
unite_fun <- function(df, var1 = mpg, var2 = cyl, col_name = hello){
var1 <- enquo(var1)
var2 <- enquo(var2)
col_name <- enquo(col_name)
col1_name <- quo_name(col_name)
mtcars %>%
as_tibble() %>%
select(!!var1 , !!var2) %>%
mutate_all(as.character) %>%
unite(col = !!col_name, sep = "/") %>%
mutate(!!col1_name := str_replace(!!col_name, "/", ""))
}
unite_fun(mtcars, mpg, cyl)
# A tibble: 32 x 1
# hello
# <chr>
# 1 216
# 2 216
# 3 22.84
# 4 21.46
# 5 18.78
# 6 18.16
# 7 14.38
# 8 24.44
# 9 22.84
#10 19.26
# … with 22 more rows
我们可以利用 rlang -0.4.0
中的 {{..}}
- curly-curly 运算符,它应该可以更轻松地进行评估
library(dplyr)
library(rlang)
library(tidyr)
unite_fun <- function(df, var1, var2, col_name = hello){
df %>%
as_tibble() %>%
select({{var1}} , {{var2}}) %>%
mutate_all(as.character) %>%
unite(col = {{col_name}}, sep = "")
}
unite_fun(mtcars, mpg, cyl)
# A tibble: 32 x 1
# hello
# <chr>
# 1 216
# 2 216
# 3 22.84
# 4 21.46
# 5 18.78
# 6 18.16
# 7 14.38
# 8 24.44
# 9 22.84
#10 19.26
# … with 22 more rows
如果我们需要在最后使用mutate
步骤
unite_fun <- function(df, var1, var2, col_name = hello){
df %>%
as_tibble() %>%
select({{var1}} , {{var2}}) %>%
mutate_all(as.character) %>%
unite(col = {{col_name}}, sep = "/") %>%
mutate_at(1, ~ str_replace(., "/", ""))
}
unite_fun(mtcars, mpg, cyl)
# A tibble: 32 x 1
# hello
# <chr>
# 1 216
# 2 216
# 3 22.84
# 4 21.46
# 5 18.78
# 6 18.16
# 7 14.38
# 8 24.44
# 9 22.84
#10 19.26
# … with 22 more rows