按治疗类型汇总(计数/频率),其中个体可以接受两种治疗

时间:2015-02-04 16:20:35

标签: r dplyr

说我们有这些数据:

dat<-data.frame(id=c(1,1,2,2,3,4,4,5,6,6),Rx=c(1,2,1,2,1,1,1,2,2,2))

   id Rx
1   1  1
2   1  2
3   2  1
4   2  2
5   3  1
6   4  1
7   4  1
8   5  2
9   6  2
10  6  2

其中Id是主题ID,Rx是他们收到的治疗。因此,有重复观察,治疗可能或可能不一致。

我希望能够总结有多少科目只收到Rx 1,只收到Rx 2,收到Rx 1和2多少。

我更喜欢dplyr解决方案,但data.tablebase R也可以。我想的是:

dat %>%
  group_by(id,Rx) %>%
  unique() %>%
  ...something

最终结果应该是:

  Rx    Count
   1        2
   2        2
Both        2

谢谢!

3 个答案:

答案 0 :(得分:5)

这是另一个通用解决方案

library(dplyr)
dat %>%
  group_by(id) %>%
  summarise(indx = toString(sort(unique(Rx)))) %>%
  ungroup() %>%
  count(indx)

# Source: local data table [3 x 2]
# 
#   indx n
# 1 1, 2 2
# 2    1 2
# 3    2 2

data.table,同样

library(data.table)
setDT(dat)[, .(indx = toString(sort(unique(Rx)))), id][ , .N, indx]

答案 1 :(得分:3)

这个解决方案能够很好地概括为2种以上的治疗方法:

library(dplyr)

dat %>%
  distinct(id, Rx) %>%
  group_by(id) %>%
  mutate(
    trt1 = setequal(1, Rx), # change due to comment from @Marat Talipov
    trt2 = setequal(2, Rx),
    both = setequal(1:2, Rx)
    ) %>%
  ungroup() %>%
  distinct(id) %>%
  summarise_each(funs(sum), trt1:both)

这种解决方案更短,并且可以推广到多种治疗方法:

library(stringr)

dat %>%
  group_by(id) %>%
  mutate(
    rx_list = str_c(sort(unique(Rx)), collapse = ",")
    ) %>%
  distinct(id) %>%
  count(rx_list)

答案 2 :(得分:2)

不完全是你指出的输出,但它是基础R,单线和一般:

 table(do.call(function(...) paste(...,sep="_"),as.data.frame(table(dat)>0)))
 #FALSE_TRUE TRUE_FALSE  TRUE_TRUE 
     2          2          2

如果治疗次数超过两次,则表明所有可能的组合。