如何描述多个变量的分组观察值的唯一值?
How to describe unique values of grouped observations for several vars?
我有一个tibble,每个病人都可以观察几次。所以名字是这样的:
id_patient(数量); id_eval(数量); treat_1(合乎逻辑); treat_2(合乎逻辑); treat_1_type(字符); treat_2_type(字符)。
我想要的:摘要 table(含 tbl_summary)描述独特的价值,以了解有多少患者(至少有 1 次)担心一种可能性。像这样:
var
All patients (n=N)
treat_1
AA (aa %)
treat_2
BB (bb %)
treat_1_type
- Type_1
CC (cc %)
- Type_2
DD (dd %)
treat_2_type
- Type_1
EE (ee %)
- Type_2
FF (ff %)
- Type_3
GG (gg %)
我现在有的是:
evals %>%
group_by(id_patient) %>%
select(id_patient, treat_1, treat_2) %>%
summarise(across(everything(), .fns = unique))
summary()
但这给了我所有现有的 TRUE/FALSE 组合,因此它并不代表真正独特的值。这是逻辑部分,所以很简单,它不适用于因数...
你认为我怎样才能做到这一点?
我希望你给了我们一些数据。
但是让我们自己生产吧。
library(tidyverse)
n=10
evals = tibble(
id_patient = sample(1:50, n, replace = T),
id_eval = sample(120:277, n),
treat_1 = sample(c(T, F), n, replace = T),
treat_2 = sample(c(T, F), n, replace = T),
treat_1_type = sample(c("Type_1", "Type_2"), n, replace = T),
treat_2_type = sample(c("Type_1", "Type_2", "Type_3"), n, replace = T)
)
evals
输出
# A tibble: 10 x 6
id_patient id_eval treat_1 treat_2 treat_1_type treat_2_type
<int> <int> <lgl> <lgl> <fct> <fct>
1 42 237 TRUE FALSE Type_2 Type_3
2 24 240 FALSE FALSE Type_1 Type_1
3 10 236 TRUE FALSE Type_1 Type_3
4 27 153 TRUE FALSE Type_1 Type_2
5 29 126 TRUE FALSE Type_2 Type_1
6 18 194 FALSE TRUE Type_1 Type_2
7 18 215 TRUE FALSE Type_2 Type_2
8 48 205 TRUE FALSE Type_1 Type_3
9 12 131 FALSE FALSE Type_1 Type_2
10 13 225 FALSE FALSE Type_2 Type_3
还好吗?但愿如此。
下面就随你做一个总结吧。
seval = evals %>%
group_by(id_patient) %>%
summarise(
treat_1 = sum(treat_1)>0,
treat_2 = sum(treat_2)>0,
treat_1_Type_1 = sum(treat_1_type=="Type_1")>0,
treat_1_Type_2 = sum(treat_1_type=="Type_2")>0,
treat_2_Type_1 = sum(treat_2_type=="Type_1")>0,
treat_2_Type_2 = sum(treat_2_type=="Type_2")>0,
treat_2_Type_3 = sum(treat_2_type=="Type_3")>0
) %>% summarise(
treat_1 = sum(treat_1),
treat_2 = sum(treat_2),
treat_1_Type_1 = sum(treat_1_Type_1),
treat_1_Type_2 = sum(treat_1_Type_2),
treat_2_Type_1 = sum(treat_2_Type_1),
treat_2_Type_2 = sum(treat_2_Type_2),
treat_2_Type_3 = sum(treat_2_Type_3)
)
输出
# A tibble: 1 x 7
treat_1 treat_2 treat_1_Type_1 treat_1_Type_2 treat_2_Type_1 treat_2_Type_2 treat_2_Type_3
<int> <int> <int> <int> <int> <int> <int>
1 6 1 6 4 2 4 4
现在你可以轻松计算出比例
seval %>%
pivot_longer(everything(), names_to = "var", values_to = "val") %>%
group_by(var) %>%
mutate(prop = val/length(unique(evals$id_patient)))
输出
# A tibble: 7 x 3
# Groups: var [7]
var val prop
<chr> <int> <dbl>
1 treat_1 6 0.667
2 treat_2 1 0.111
3 treat_1_Type_1 6 0.667
4 treat_1_Type_2 4 0.444
5 treat_2_Type_1 2 0.222
6 treat_2_Type_2 4 0.444
7 treat_2_Type_3 4 0.444
我测试了 chr
和 factor
变量的所有内容,一切正常。
我有一个tibble,每个病人都可以观察几次。所以名字是这样的: id_patient(数量); id_eval(数量); treat_1(合乎逻辑); treat_2(合乎逻辑); treat_1_type(字符); treat_2_type(字符)。
我想要的:摘要 table(含 tbl_summary)描述独特的价值,以了解有多少患者(至少有 1 次)担心一种可能性。像这样:
var | All patients (n=N) |
---|---|
treat_1 | AA (aa %) |
treat_2 | BB (bb %) |
treat_1_type | |
- Type_1 | CC (cc %) |
- Type_2 | DD (dd %) |
treat_2_type | |
- Type_1 | EE (ee %) |
- Type_2 | FF (ff %) |
- Type_3 | GG (gg %) |
我现在有的是:
evals %>%
group_by(id_patient) %>%
select(id_patient, treat_1, treat_2) %>%
summarise(across(everything(), .fns = unique))
summary()
但这给了我所有现有的 TRUE/FALSE 组合,因此它并不代表真正独特的值。这是逻辑部分,所以很简单,它不适用于因数...
你认为我怎样才能做到这一点?
我希望你给了我们一些数据。 但是让我们自己生产吧。
library(tidyverse)
n=10
evals = tibble(
id_patient = sample(1:50, n, replace = T),
id_eval = sample(120:277, n),
treat_1 = sample(c(T, F), n, replace = T),
treat_2 = sample(c(T, F), n, replace = T),
treat_1_type = sample(c("Type_1", "Type_2"), n, replace = T),
treat_2_type = sample(c("Type_1", "Type_2", "Type_3"), n, replace = T)
)
evals
输出
# A tibble: 10 x 6
id_patient id_eval treat_1 treat_2 treat_1_type treat_2_type
<int> <int> <lgl> <lgl> <fct> <fct>
1 42 237 TRUE FALSE Type_2 Type_3
2 24 240 FALSE FALSE Type_1 Type_1
3 10 236 TRUE FALSE Type_1 Type_3
4 27 153 TRUE FALSE Type_1 Type_2
5 29 126 TRUE FALSE Type_2 Type_1
6 18 194 FALSE TRUE Type_1 Type_2
7 18 215 TRUE FALSE Type_2 Type_2
8 48 205 TRUE FALSE Type_1 Type_3
9 12 131 FALSE FALSE Type_1 Type_2
10 13 225 FALSE FALSE Type_2 Type_3
还好吗?但愿如此。 下面就随你做一个总结吧。
seval = evals %>%
group_by(id_patient) %>%
summarise(
treat_1 = sum(treat_1)>0,
treat_2 = sum(treat_2)>0,
treat_1_Type_1 = sum(treat_1_type=="Type_1")>0,
treat_1_Type_2 = sum(treat_1_type=="Type_2")>0,
treat_2_Type_1 = sum(treat_2_type=="Type_1")>0,
treat_2_Type_2 = sum(treat_2_type=="Type_2")>0,
treat_2_Type_3 = sum(treat_2_type=="Type_3")>0
) %>% summarise(
treat_1 = sum(treat_1),
treat_2 = sum(treat_2),
treat_1_Type_1 = sum(treat_1_Type_1),
treat_1_Type_2 = sum(treat_1_Type_2),
treat_2_Type_1 = sum(treat_2_Type_1),
treat_2_Type_2 = sum(treat_2_Type_2),
treat_2_Type_3 = sum(treat_2_Type_3)
)
输出
# A tibble: 1 x 7
treat_1 treat_2 treat_1_Type_1 treat_1_Type_2 treat_2_Type_1 treat_2_Type_2 treat_2_Type_3
<int> <int> <int> <int> <int> <int> <int>
1 6 1 6 4 2 4 4
现在你可以轻松计算出比例
seval %>%
pivot_longer(everything(), names_to = "var", values_to = "val") %>%
group_by(var) %>%
mutate(prop = val/length(unique(evals$id_patient)))
输出
# A tibble: 7 x 3
# Groups: var [7]
var val prop
<chr> <int> <dbl>
1 treat_1 6 0.667
2 treat_2 1 0.111
3 treat_1_Type_1 6 0.667
4 treat_1_Type_2 4 0.444
5 treat_2_Type_1 2 0.222
6 treat_2_Type_2 4 0.444
7 treat_2_Type_3 4 0.444
我测试了 chr
和 factor
变量的所有内容,一切正常。