【发布时间】:2019-12-20 14:20:12
【问题描述】:
我正在使用 R 的 dplyr 包来获取几个变量的汇总统计信息,其中许多变量的名称都相似。例如,我有数百个变量都命名为doctor_id_X,其中X 是某个整数(例如doctor_id_1、doctor_id_33、doctor_id_543 等)。我可以很容易地获得这些“doctor_id”变量的最大值,这些变量按treatment1分组,在summarize_at语句中使用所谓的“助手”,如下所示:
mydf %>% group_by(treatment1) %>%
summarize_at(vars(contains("doctor_id")), max)
但是,除了获得这些max 统计数据之外,我还试图获得一些其他变量的平均值,这些变量的名称与doctor_id 变量之一类似,称为procedure_time。有没有办法通过修改我上面的代码来有效地做到这一点?
为了更好地解释我想要做什么,这是一个数据框的玩具示例:
library(dplyr)
set.seed(20190813)
mydf <- data.frame(treatment1 = sample(LETTERS[1:3], 100, replace=TRUE),
treatment2 = sample(LETTERS[4:5], 100, replace=TRUE),
doctor_id_1=rbinom(100, 1, .01),
doctor_id_2=rbinom(100, 1, .5),
doctor_id_3=rbinom(100, 1, .6),
doctor_id_4=rbinom(100, 1, .7),
y=rnorm(100))
head(mydf)
treatment1 treatment2 doctor_id_1 doctor_id_2 doctor_id_3 doctor_id_4 y
1 A D 0 0 1 0 -1.1175362
2 A E 0 0 1 1 -2.2813598
3 A D 0 1 1 0 0.5886914
4 A D 0 0 1 1 0.9854405
5 B E 0 0 1 1 1.8831306
6 A E 0 1 1 1 -0.3875261
通过doctor_id 变量获取max 值摘要没有问题:
mydf %>% group_by(treatment1) %>%
summarize_at(vars(contains("doctor_id")), max)
# A tibble: 3 x 5
treatment1 doctor_id_1 doctor_id_2 doctor_id_3 doctor_id_4
<fct> <int> <int> <int> <int>
1 A 1 1 1 1
2 B 0 1 1 1
3 C 0 1 1 1
但是现在,我还想在汇总语句中找到y 的mean。我试过了,但没有用:
mydf %>% group_by(treatment1) %>%
summarize_at(y_avg=mean(y), vars(y, contains("doctor_id")), max)
但是,我确实注意到,以下内容让我更接近我想要的,只是它为所有 doctor_id 变量和 y 变量生成了 max,但我只需要 @987654344 @ 代表y 变量。
mydf %>% group_by(treatment1) %>%
summarize_at(vars(y, contains("doctor_id")), max)
# A tibble: 3 x 6
treatment1 y doctor_id_1 doctor_id_2 doctor_id_3 doctor_id_4
<fct> <dbl> <int> <int> <int> <int>
1 A 1.70 1 1 1 1
2 B 1.88 0 1 1 1
3 C 1.45 0 1 1 1
这也让我很接近,但它为两个变量生成了两个统计数据:
mydf %>% group_by(treatment1) %>%
summarize_at(vars(y, contains("doctor_id")), c(max, mean))
所以,总而言之,我的问题是,有没有办法在 summarise_by 语句中使用辅助函数,并且还包括另一个变量的不同统计信息,而不必求助于连接?
【问题讨论】:
标签: r group-by dplyr summarize