[英]Passing a string to an R function and using it as a column name within the function
我有一個 dataframe 和幾個科目的學生分數列表(每個科目由一列表示)我想為每個科目(數學、科學和閱讀)做下面的計算
avgdata_math <- data%>%
group_by(country) %>%
summarise(ci = list(bootstrap_ci(sex, Math, weight))) %>%
unnest_wider(ci) %>%
ungroup() %>%
mutate(country = fct_reorder(country, avg))
由於我必須重復兩次相同的代碼,我想編寫一個 function 來進行計算(不旋轉數據框)
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 function 時使用了字符串值,而它應該是在那里傳遞的一列數據(應該是分組操作后)。
在 function 中使用:: 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))
}
更新
如果您還想將分組變量作為字符串傳遞到 function 中,並且如果您有時想要分組的變量不止一個,那么使用!!!
, rlang::ensyms()
和 ellipsis ...
參數可以解決問題,如果不是你的 function 的最后一行。 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))
}
如果您不想使用 ellipsis 參數,則可以使用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))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.