我最近开始使用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>`.`
如果有人可以给我提示我在这里做错了什么,或者有一个更优雅的解决方案,那就太好了。
答案 0 :(得分:0)
compare
函数一次获取v_reg_var
和v_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的解决方案,只是我希望避免从全局环境中调用。
我还怀疑您的原始表可以做成长格式,这样会更容易