使用 dplyr 汇总分组数据时,从另一行中的单元格中减去一行中的单元格?
Subtracting cell in one row from cell in another row when summarizing grouped data with dplyr?
背景: 我有来自模拟的数据,其中我有一些变量,因此有许多参数组合。由于模拟的内部设计,相同参数集的结果可能会有一点差异,所以我 运行 一些相同的 运行s,然后计算它们的最小值、最大值和平均值分数。然后,我想比较治疗和未治疗的情况:
- 计算治疗减去未治疗的平均值
- 计算治疗的最低分减去未治疗的最高分的差值
- 计算治疗的最高分减去未治疗的最低分的差值
这给了我平均差异以及最好和最坏情况比较的界限。
示例数据:
my_data <- tribble(
~params, ~treatment, ~mean_score, ~min_score, ~max_score,
"combo a", 0, 91, 90, 92,
"combo a", 1, 92, 92, 92,
"combo b", 0, 89, 87, 91,
"combo b", 1, 92, 89, 92,
"combo c", 0, 90, 90, 90,
"combo c", 1, 89, 85, 93,
)
吹掉我的 R 技能的灰尘,我的初步尝试如下,但我不知道如何总结应该从分组中的哪一行中减去哪一行。
我知道的代码尝试不起作用:
my_summ_data <- mydata %>%
dplyr::group_by(params = as.factor(params)) %>%
dplyr::summarize(hier_diff=diff(mean_score),
min_max_diff=diff(c(min_score, max_score)),
max_min_diff=diff(c(max_score, min_score)) )
我想得到
params
hier_diff
min_max_diff
max_min_diff
combo a
1
0
2
combo b
3
-2
5
combo c
-1
-5
3
但我得到了(顺便说一句,我还不明白为什么我得到这些额外的行)
params
hier_diff
min_max_diff
max_min_diff
combo a
1
2
0
combo a
1
0
-2
combo a
1
0
2
combo b
1
2
0
combo b
1
2
-4
combo b
1
0
2
combo c
2
-2
6
combo c
2
2
-6
combo c
2
6
-2
我不相信有一种明智的方法可以使用总结来完成我想做的事情。但如果有,我想知道,如果没有,下一个最佳选择是什么?
请在下面找到一种可能的解决方案。
Reprex
- 代码
library(dplyr)
library(tibble)
my_summ_data <- my_data %>%
dplyr::group_by(params) %>%
dplyr::arrange(treatment) %>%
dplyr::summarize(hier_diff=diff(mean_score),
min_max_diff=diff(c(max_score[1], min_score[2])),
max_min_diff=diff(c(min_score[1], max_score[2])))
- 输出
my_summ_data
#> # A tibble: 3 x 4
#> params hier_diff min_max_diff max_min_diff
#> <chr> <dbl> <dbl> <dbl>
#> 1 combo a 1 0 2
#> 2 combo b 3 -2 5
#> 3 combo c -1 -5 3
由 reprex package (v2.0.1)
于 2022-02-14 创建
my_data %>%
dplyr::group_by(params = as.factor(params)) %>%
dplyr::summarize(
hier_diff= mean_score[treatment==1] - mean_score[treatment==0],
min_max_diff=min_score[treatment==1] - max_score[treatment==0], # EDIT -- removed unneeded min/max
max_min_diff=max_score[treatment==1] - min_score[treatment==0] # EDIT -- removed unneeded min/max
)
结果
# A tibble: 3 x 4
params hier_diff min_max_diff max_min_diff
<fct> <dbl> <dbl> <dbl>
1 combo a 1 0 2
2 combo b 3 -2 5
3 combo c -1 -5 3
请注意,即使处理行出现在 no-treatment 行之前,答案也是相同的,例如:
my_data <- tribble(
~params, ~treatment, ~mean_score, ~min_score, ~max_score,
"combo a", 1, 92, 92, 92, # swapped rows 1+2, 3+4, 5+6
"combo a", 0, 91, 90, 92,
"combo b", 1, 92, 89, 92,
"combo b", 0, 89, 87, 91,
"combo c", 1, 89, 85, 93,
"combo c", 0, 90, 90, 90,
)
背景: 我有来自模拟的数据,其中我有一些变量,因此有许多参数组合。由于模拟的内部设计,相同参数集的结果可能会有一点差异,所以我 运行 一些相同的 运行s,然后计算它们的最小值、最大值和平均值分数。然后,我想比较治疗和未治疗的情况:
- 计算治疗减去未治疗的平均值
- 计算治疗的最低分减去未治疗的最高分的差值
- 计算治疗的最高分减去未治疗的最低分的差值
这给了我平均差异以及最好和最坏情况比较的界限。
示例数据:
my_data <- tribble(
~params, ~treatment, ~mean_score, ~min_score, ~max_score,
"combo a", 0, 91, 90, 92,
"combo a", 1, 92, 92, 92,
"combo b", 0, 89, 87, 91,
"combo b", 1, 92, 89, 92,
"combo c", 0, 90, 90, 90,
"combo c", 1, 89, 85, 93,
)
吹掉我的 R 技能的灰尘,我的初步尝试如下,但我不知道如何总结应该从分组中的哪一行中减去哪一行。
我知道的代码尝试不起作用:
my_summ_data <- mydata %>%
dplyr::group_by(params = as.factor(params)) %>%
dplyr::summarize(hier_diff=diff(mean_score),
min_max_diff=diff(c(min_score, max_score)),
max_min_diff=diff(c(max_score, min_score)) )
我想得到
params | hier_diff | min_max_diff | max_min_diff |
---|---|---|---|
combo a | 1 | 0 | 2 |
combo b | 3 | -2 | 5 |
combo c | -1 | -5 | 3 |
但我得到了(顺便说一句,我还不明白为什么我得到这些额外的行)
params | hier_diff | min_max_diff | max_min_diff |
---|---|---|---|
combo a | 1 | 2 | 0 |
combo a | 1 | 0 | -2 |
combo a | 1 | 0 | 2 |
combo b | 1 | 2 | 0 |
combo b | 1 | 2 | -4 |
combo b | 1 | 0 | 2 |
combo c | 2 | -2 | 6 |
combo c | 2 | 2 | -6 |
combo c | 2 | 6 | -2 |
我不相信有一种明智的方法可以使用总结来完成我想做的事情。但如果有,我想知道,如果没有,下一个最佳选择是什么?
请在下面找到一种可能的解决方案。
Reprex
- 代码
library(dplyr)
library(tibble)
my_summ_data <- my_data %>%
dplyr::group_by(params) %>%
dplyr::arrange(treatment) %>%
dplyr::summarize(hier_diff=diff(mean_score),
min_max_diff=diff(c(max_score[1], min_score[2])),
max_min_diff=diff(c(min_score[1], max_score[2])))
- 输出
my_summ_data
#> # A tibble: 3 x 4
#> params hier_diff min_max_diff max_min_diff
#> <chr> <dbl> <dbl> <dbl>
#> 1 combo a 1 0 2
#> 2 combo b 3 -2 5
#> 3 combo c -1 -5 3
由 reprex package (v2.0.1)
于 2022-02-14 创建my_data %>%
dplyr::group_by(params = as.factor(params)) %>%
dplyr::summarize(
hier_diff= mean_score[treatment==1] - mean_score[treatment==0],
min_max_diff=min_score[treatment==1] - max_score[treatment==0], # EDIT -- removed unneeded min/max
max_min_diff=max_score[treatment==1] - min_score[treatment==0] # EDIT -- removed unneeded min/max
)
结果
# A tibble: 3 x 4
params hier_diff min_max_diff max_min_diff
<fct> <dbl> <dbl> <dbl>
1 combo a 1 0 2
2 combo b 3 -2 5
3 combo c -1 -5 3
请注意,即使处理行出现在 no-treatment 行之前,答案也是相同的,例如:
my_data <- tribble(
~params, ~treatment, ~mean_score, ~min_score, ~max_score,
"combo a", 1, 92, 92, 92, # swapped rows 1+2, 3+4, 5+6
"combo a", 0, 91, 90, 92,
"combo b", 1, 92, 89, 92,
"combo b", 0, 89, 87, 91,
"combo c", 1, 89, 85, 93,
"combo c", 0, 90, 90, 90,
)