簡體   English   中英

在 function 中使用字符串向量作為變量,使用 dplyr::summarise()

[英]Using string vectors as variables in a function using dplyr::summarise()

我最近開始使用 R 來處理我的研究數據(並且絕對不后悔離開 SPSS)並且找不到解決以下問題的方法:遭受某種類型的並發症是/否?-> reg_var)並在與二進制變量相關的連續變量上運行 dplyr 的匯總 function(提到的並發症的估計風險有多高 -> reg_yr)。 我現在想為多對變量(例如 compare(reg_var1, reg_yr1)、compare(reg_var2, reg_yr2) 和 compare(reg_var3, reg_yr3))運行這個 function 並創建多個我可以稍后合並的小標題。 我創建了兩個包含變量名稱的向量(v_reg_var 和 v_reg_yr)。

    library(tidyverse)
    # Create a function to calculate and compare est. risk percentages
    # of patients with/without actual complications
    compare <-function(reg_var, reg_yr) {
    datatable %>%
    group_by(.data[[reg_var]]) %>%
    summarise(
    n(), mean(.data[[reg_yr]]), sd(.data[[reg_yr]]), median(.data[[reg_yr]]), min(.data[[reg_yr]]), max(.data[[reg_yr]]),
    "25%" = quantile(.data[[reg_yr]], probs = 0.25),
    "50%" = quantile(.data[[reg_yr]], probs = 0.5),
    "75%" = quantile(.data[[reg_yr]], probs = 0.75))
    }
    v_reg_var <- c[reg_var1, reg_var2, reg_var3, …)
    v_reg_yr <- c[reg_yr1, reg_yr2, reg_yr3, …)
    # Now if I run compare() using two vectors which only contain one character string it works just
    # fine but unfortunately if I run compare(v_reg_var, v_reg_yr), I receive the following error:

    compare(v_reg_var, v_reg_yr)

   Error: Problem with \mutate()` input `..1`.`
   x Must subset the data pronoun with a string
   ℹ Input \..1` is `<unknown>`.`

如果有人能給我提示我在這里做錯了什么或者是否有更優雅的解決方案,那就太好了。

compare function 一次取一個值v_reg_varv_reg_yr 要並行傳遞它們,您可以使用Map

Map(compare, v_reg_var, v_reg_yr)

或者,由於您主要使用tidyverse ,因此相當於map2來自purrr

purrr::map2(v_reg_var, v_reg_yr, compare)

map2將返回數據框列表。 如果您想在一個 dataframe 中獲取所有數據,您可以使用purrr::map2_df

您擁有的 function 僅適用於 1 個變量,並且不會遍歷所有變量。 首先,我們通過調用基礎 R 總結 function 來簡化 function,並使用.!as.name()而不是從數據中調用它:

fn = function(V){
   c(n=length(V),sd=sd(V),summary(V))
}

library(tidyverse)

datatable = data.frame(y1=sample(1:5,100,replace=TRUE),
y2=sample(1:5,100,replace=TRUE),
v1=runif(100),v2=runif(100))
    
compare <-function(df,reg_var,reg_yr) {
    df %>%
    group_by(!!as.name(reg_yr)) %>%
    summarise(res=list(fn( !!as.name(reg_var) ) ) )%>% 
    unnest_wider(res)
    }

compare(datatable,"v1","y1")
# A tibble: 5 x 9
     y1     n    sd   Min. `1st Qu.` Median  Mean `3rd Qu.`  Max.
  <int> <dbl> <dbl>  <dbl>     <dbl>  <dbl> <dbl>     <dbl> <dbl>
1     1    18 0.267 0.0241    0.185   0.276 0.373     0.568 0.814
2     2    24 0.288 0.0443    0.243   0.396 0.470     0.664 0.986
3     3    20 0.330 0.0446    0.234   0.474 0.501     0.777 0.987
4     4    14 0.203 0.0171    0.0566  0.208 0.247     0.408 0.600
5     5    24 0.299 0.0138    0.235   0.457 0.491     0.742 0.948

現在我們遍歷你的對:

v_reg_var <- c("v1","v2")
v_reg_yr <- c("y1","y2")

1:length(v_reg_var) %>% 
map(~compare(datatable,v_reg_var[.x],v_reg_yr[.x]))

最后一部分類似於@RonakShah 的解決方案,只是我傾向於避免從全局環境調用。

另外我懷疑您的原始表格可以制作成長格式,這會更容易

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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