考虑一个小标题,其中每一列都是可以采用许多值的字符向量-假设是“ A”到“ F”。
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
我希望创建一个函数,该函数将列名作为参数,并重新编码该列,以使任何答案“ A”都变为NA,否则按原样返回df。以这种方式设计它的原因是适合于使用给定列执行一系列操作的更广泛的管道。
有很多方法可以做到这一点。但是我有兴趣了解最佳的惯用tidy_eval / tidyverse方法是什么。首先,问题名称必须位于变异动词的左侧,因此我们适当地使用!!
and :=
运算符。但是,那该放在右边呢?
fix_question <- function(df, question) {
df %>% mutate(!!question := recode(... something goes here...))
}
fix_question(sample_df, "q1") # should produce a tibble whose first column is (NA, "B", "C")
我最初的想法是,这将起作用:
df %>% mutate(!!question := recode(!!question, "A" = NA_character_))
但是,当然,函数内部的爆炸只是返回文字字符串(例如“ q1”)。我最终采取了一种感觉很拙劣的方法,即使用基本R [[
运算符并依靠.
dplyr 的构造来在右侧引用数据,并且它起作用了,因此从某种意义上说,我已经解决了我的根本问题:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
我有兴趣从精通tidyeval的人那里获得反馈,以了解是否有更惯用的方法来执行此操作,希望看到一个可行的示例可以增强我对tidyeval函数集的更一般的理解。有什么想法吗?
q1
(符号)和"q1"
(字符串):df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)