如何描述多个变量的分组观察值的唯一值?

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  

我测试了 chrfactor 变量的所有内容,一切正常。