在dplyr中应用cut

时间:2015-11-28 22:33:05

标签: r dplyr cut

我有一个数据框,如下例所示:

  ID   <- 1:6
  DRUG <- c(1,1,0,1,0,0)
  PRD  <- c(1,1,2,2,3,3)
  MAX  <- c(15,20,50,18,80,350)

  df <- data.frame(ID,DRUG,PRD,MAX)

我希望将MAX添加到预定义的时间间隔,并按DRUGPRD为每个类别中ID的数量制作摘要。

我的数据集比提供的示例大得多。

有没有办法使用dplyr或任何其他包在R中进行分箱和汇总?

我尝试了这个tapply(df$MAX,cut(df$MAX,4),length),但它将数据分成相等的间隔,这不是我想要实现的。此外,它不会按DRUGPRD提供摘要。

更新:我想出了一个更好的解决方案来解决数据框中的变量问题;但是,如果间隔具有NA个观察数据,则它不会将其保留在输出摘要中。我怎么能在总结中保留它?除了报告n之外,如何将输出作为百分比。

df %>%
  group_by(DRUG,PRD,cut(MAX,breaks=c(0,20,40,60,Inf))) %>%
  summarise(n=n())

这给出了:

   DRUG   PRD cut(MAX, breaks = c(0, 20, 40, 60, In...     n
  (dbl) (dbl)                                   (fctr) (int)
1     0     2                                  (40,60]     1
2     0     3                                 (60,Inf]     2
3     1     1                                   (0,20]     2
4     1     2                                   (0,20]     1

所以在这里,例如,DRUG==0PRD==2的区间(0,15)没有出现在摘要中,因为在这个区间内没有任何值。我怎么能即使在该时间间隔内没有任何值,也会有所有的时间间隔(它应该改为NA)?另外,我如何根据每个中ID的总数添加一个计算的百分比DRUGPRD类别?

1 个答案:

答案 0 :(得分:1)

根据评论和您尝试过的内容,您可以使用以下内容:

tapply(df$MAX,cut(df$MAX, breaks = c(0, 15, 30, 60, 100, Inf)),length)