【发布时间】:2021-08-25 00:18:45
【问题描述】:
我想知道如何在新的dplyr 1.0.0 中使用 mutate() 转换函数内的现有变量,但我在函数的左侧遇到了问题。这是我的问题
library(dplyr)
library(forcats)
# toy data
df <- tibble(d_1_a = factor(c(letters[1:5],NA,NA)),
d_1_b = factor(c(NA,NA,letters[1:5])))
现在,使用新的dplyr 编程语法.data[[foo]],我可以创建一个函数,将现有列变为新列,在本例中将fct_explicit_na 函数应用于列。
muteFunct <- function(d, i) {
d %>% mutate(newFact = forcats::fct_explicit_na(.data[[i]]))
}
muteFunct(df, "d_1_a")
# output
# d_1_a d_1_b newFact
# <fct> <fct> <fct>
# 1 a NA a
# 2 b NA b
# 3 c a c
# 4 d b d
# 5 e c e
# 6 NA d (Missing)
# 7 NA e (Missing)
效果很好。请注意带有显式 NA 的新列。但是,如果我想转换 existing 列,左侧也需要通过函数传入的参数这一事实会导致问题(无论如何都会导致 me 问题)。我已经尝试了几种方法,但这是一种尝试,使用 !! 运算符
muteFunct2 <- function(d, i) {
d %>% mutate(!!.data[[i]] := forcats::fct_explicit_na(.data[[i]]))
}
muteFunct2(df, "d_1_a")
这会生成以下错误消息
Error: The LHS of `:=` must be a string or a symbol
Run `rlang::last_error()` to see where the error occurred.
谁能帮帮我?
注意:我知道有更好的方法可以在 dplyr 中实现特定结果(显式 NA),而无需创建定制函数,但是,此特定示例仅用于说明目的。我一般更感兴趣的是如何将参数传递到= 登录mutate() 的左侧
【问题讨论】: