将字符串传递给R函数并将其用作函数中的列名

时间:2020-05-25 07:04:52

标签: r function dplyr tidyeval

我有一个数据框,其中列出了几个学科(每个学科由一列表示)的学生分数列表,我想在下面针对每个学科(数学,科学和阅读)进行计算

avgdata_math <- data%>% 
   group_by(country) %>% 
   summarise(ci = list(bootstrap_ci(sex, Math, weight))) %>% 
   unnest_wider(ci) %>% 
   ungroup() %>% 
   mutate(country = fct_reorder(country, avg))

由于我必须重复两次相同的代码,所以我想编写一个函数来进行计算(不旋转数据框)

aus_nz <- function(df, subject = "Math") {
   df %>%
    group_by(country) %>% 
    summarise(ci = list(bootstrap_ci(sex, subject, weight))) %>% 
    unnest_wider(ci) %>% 
    ungroup() %>% 
    mutate(country = fct_reorder(country, avg))
}

这给了我一个错误,因为我已经将列名(主题)作为字符串传递了,然后对数据进行了分组,然后在调用bootstrap_ci函数时使用了字符串值,而它应该是在那里传递的数据列(应该在分组操作之后。

1 个答案:

答案 0 :(得分:1)

在函数中使用!! rlang::ensym(subject)应该可以。

aus_nz <- function(df, subject = "Math") {
   df %>%
    group_by(country) %>% 
    summarise(ci = list(bootstrap_ci(sex, !! rlang::ensym(subject), weight))) %>% 
    unnest_wider(ci) %>% 
    ungroup() %>% 
    mutate(country = fct_reorder(country, avg))
}

更新

如果您还希望将分组变量作为字符串传递给函数,并且有时有时要分组的变量不只一个,则可以使用!!!rlang::ensyms()和省略号{如果不是您函数的最后一行,则使用{1}}参数就可以解决问题。 ...仅期望一个变量。如果有两个分组变量:您会怎么做?创建两个新变量,然后按fct_reorder对每个分组变量重新排序?查看数据(也许使用avg也会很有帮助。

dput(head(...))

如果不想使用省略号参数,则可以使用aus_nz <- function(df, subject = "Math", ...) { group_var <- rlang::ensyms(...) df %>% group_by(!!! group_var) %>% summarise(ci = list(bootstrap_ci(sex, !! rlang::ensym(subject), weight))) %>% unnest_wider(ci) %>% ungroup() # %>% last line needs to be fixed # mutate(grouped_by = fct_reorder(!!! group_var, avg)) } 和一个字符向量(具有一个或多个元素)代替:

rlang::syms