Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按治疗类型总结(计数/频率),其中个人可以同时接受两种治疗_R_Dplyr - Fatal编程技术网

R 按治疗类型总结(计数/频率),其中个人可以同时接受两种治疗

R 按治疗类型总结(计数/频率),其中个人可以同时接受两种治疗,r,dplyr,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 最终结果应该是: dat %>% group_by(id,Rx) %>% unique() %>% .

假设我们有这些数据:

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
最终结果应该是:

dat %>%
  group_by(id,Rx) %>%
  unique() %>%
  ...something
  Rx    Count
   1        2
   2        2
Both        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)

这是另一个广义解

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

数据表
类似

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

不完全是您所指示的输出,但它是基本R、一行和通用:

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

如果治疗方法多于两种,则说明了所有可能的组合。

是否希望解决方案推广到两种以上的治疗方法?真正的问题只有两种治疗方法,因此推广并不可怕,但是作为一种学习经验和以后的应用,如果将其推广到2种以上的治疗方法,我们将不胜感激。第一种解决方案:您可以使用
setequal(XXX,dat$Rx)
(XXX可以是1,2或c(1,2)),而不是
%in%
如果治疗顺序不同,这是不完全正确的。即,对于该数据集,它将给出一个重复的
dat@DMC,对于第二种解决方案,如果顺序为1,2 vs.2,1,则形成单独的组。如果您将
rx_list
更改为
rx_list=str_c(排序(rx),collapse=“,”)
@AndrewTaylor,则此功能有效-感谢您的关注。修改了解决方案。或者,对于稍微不同的输出
表(交互(如.data.frame(表(dat)>0)))