簡體   English   中英

將字符串傳遞給 R function 並將其用作 function 中的列名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM