考虑一个数据框,其中每一列都是一个字符向量,可以取多个值 -- 假设为"A"到"F"。
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
我希望创建一个函数,以列名作为参数,并重新编码该列,使任何答案为“A”的值变成NA,其余情况返回原数据框。设计这种方式的原因是为了适应使用给定列执行一系列操作的更广泛的流程。
有许多方法可以实现这个目标,但我对理解最佳的惯用tidy_eval/tidyverse方法很感兴趣。首先,需要将问题名称放在mutate动词的左侧,因此我们恰当地使用!!和:=运算符。但接下来,在右侧放什么呢?
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_))
当然,在函数内部的bang-bang只是返回字面字符字符串(例如"q1")。我最终采取了一种看起来有点hacky的方式来引用右侧的数据,使用基本的R [[
运算符并依赖于dplyr中的.
构造,它可以工作,因此在某种意义上我已经解决了我的根本问题:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
我希望向精通tidyeval的人获取反馈,看是否有更习惯的方法来完成这个任务。希望通过实例展示来提高我对tidyeval函数集的理解。有任何想法吗?
q1
(符号)和"q1"
(字符串):df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)
。 - Artem Sokolov