r - 为什么 mutate 会在函数变量上窒息?
问题描述
这工作正常:
top_two <- c("Alderaan", "Chandrila")
starwars %>%
drop_na(homeworld) %>%
filter(gender == "feminine") %>%
mutate(homeworld = ifelse(homeworld %in% top_two,
paste(top_two, collapse = " or "),
homeworld)) %>%
count(homeworld) %>%
mutate(percent = scales::percent(n/sum(n)))
但是当我尝试将其转换为函数时,它会因“变异”而窒息
census <- function(my_var, top_two){
starwars %>%
drop_na({{my_var}}) %>%
filter(gender == "feminine") %>%
mutate({{my_var}} = ifelse({{my_var}} %in% top_two,
paste(top_two,collapse = " or "),
{{my_var}})) %>%
count({{my_var}}) %>%
mutate(percent = scales::percent(n/sum(n)))
}
top_two <- c("Alderaan", "Chandrila")
census(homeworld, top_two)
错误是
错误:意外的“=”在:“过滤器(性别==“女性”)%>%变异({{my_var}}=“
如果我my_var
从字面上表示它工作正常:
census <- function(my_var, top_two){
starwars %>%
filter(gender == "feminine") %>%
drop_na({{my_var}}) %>%
mutate(homeworld = ifelse({{my_var}} %in% top_two,
paste(top_two, collapse = " or "),
{{my_var}})) %>%
count({{my_var}}) %>%
mutate(percent = scales::percent(n/sum(n)))
}
解决方案
要使用非标准评估添加新列,您必须使用:=
. 此外,最好将数据帧作为参数传递给函数。
library(dplyr)
library(rlang)
census <- function(data, my_var, top_two){
data %>%
drop_na({{my_var}}) %>%
filter(gender == "feminine") %>%
mutate({{my_var}} := ifelse({{my_var}} %in% top_two,
paste(top_two,collapse = " or "),
{{my_var}})) %>%
count({{my_var}}) %>%
mutate(percent = scales::percent(n/sum(n)))
}
top_two <- c("Alderaan", "Chandrila")
census(starwars, homeworld, top_two)
# A tibble: 9 x 3
# homeworld n percent
# <chr> <int> <chr>
#1 Alderaan or Chandrila 2 13%
#2 Coruscant 2 13%
#3 Kamino 1 7%
#4 Mirial 2 13%
#5 Naboo 3 20%
#6 Ryloth 1 7%
#7 Shili 1 7%
#8 Tatooine 2 13%
#9 Zolan 1 7%
推荐阅读
- angular - 在angular/typescript中根据id新建数组
- npm - Webpack CopyPlugin : 添加文件到插件目录
- android - 在改造 android 中使用身份验证器刷新访问令牌
- shopware - Shopware:无法创建变体“(中间值).map 不是函数”
- rust - 如何将同一项目的 Makefile 和 vcxproj 合并到一个 CMakeList 中?
- r - 分位数回归:如何在一张图上为 2 个不同组绘制所有分位数
- oracle - 如何在 ORACLE APEX 中加入 PLSQL 中的 2 个表
- c++ - 在具有重复类型的 std::tuple 中按类型访问应该会产生编译错误
- reactjs - WEBPACK5:弃用警告,升级到 webpack 5 后,在 reactjs 17 中不推荐使用数组方法“map”
- angular - 在标题行之后的角度材料表中将页脚放在顶部而不是底部