将字符串传递给 R 函数并将其用作函数内的列名
Passing a string to an R function and using it as a column name within the function
我有一个数据框,其中列出了几个科目的学生分数(每个科目由一列表示)我想对每个科目(数学、科学和阅读)进行下面的计算
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 函数时使用字符串值,而它应该是在那里传递的数据列(应该在组操作之后)。
在您的函数中使用 !! 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()
和ellipsis ...
参数可以解决问题,如果它不是你函数的最后一行的话。 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
和字符向量(具有一个或多个元素)代替:
aus_nz <- function(df, subject = "Math", group = "country") {
group_var <- rlang::syms(group)
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))
}
我有一个数据框,其中列出了几个科目的学生分数(每个科目由一列表示)我想对每个科目(数学、科学和阅读)进行下面的计算
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 函数时使用字符串值,而它应该是在那里传递的数据列(应该在组操作之后)。
在您的函数中使用 !! 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()
和ellipsis ...
参数可以解决问题,如果它不是你函数的最后一行的话。 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
和字符向量(具有一个或多个元素)代替:
aus_nz <- function(df, subject = "Math", group = "country") {
group_var <- rlang::syms(group)
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))
}