在使用dplyr :: summarise()的函数中将字符串向量用作变量

时间:2020-07-01 09:40:34

标签: r dplyr

我最近开始使用R来处理我的研究数据(并且绝对不后悔离开SPSS),并且找不到解决以下问题的方法: 我创建了一个函数,该函数按二进制变量对数据进行分组(患者是否患有某种类型的并发症是/否?-> reg_var),并在与二进制变量关联的连续变量上运行dplyr的summary函数。提到的并发症的估计风险有多高-> reg_yr)。 我现在想对多个变量对运行此函数(例如compare(reg_var1,reg_yr1),compare(reg_var2,reg_yr2)和compare(reg_var3,reg_yr3)),并创建多个小节,以后可以合并。 我创建了两个包含变量名称的向量(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>`.`

如果有人可以给我提示我在这里做错了什么,或者有一个更优雅的解决方案,那就太好了。

2 个答案:

答案 0 :(得分:0)

compare函数一次获取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将返回数据帧列表。如果要在一个数据帧中获取所有数据,则可以使用purrr::map2_df

答案 1 :(得分:0)

您拥有的函数仅适用于1个变量,并且不会迭代所有变量。首先,我们通过调用基本R摘要函数并使用!!as.name()来简化该函数,而不是从data.frame中调用它(完全正确):

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的解决方案,只是我希望避免从全局环境中调用。

我还怀疑您的原始表可以做成长格式,这样会更容易