如何使用dplyr对列进行范围分组?

Car*_*ter 9 grouping r dplyr

我想根据列的范围值对data.table进行分组,如何使用dplyr库执行此操作?

例如,我的数据表如下所示:

library(data.table)
library(dplyr)
DT <- data.table(A=1:100, B=runif(100), Amount=runif(100, 0, 100))
Run Code Online (Sandbox Code Playgroud)

现在我想将DT分组为B组0.05间隔的20组,并计算每组中的行数.例如,列B值在[0,0.05]范围内的任何行将形成一个组; 列B值在[0.05,0.1]范围内的任何行将形成另一个组,依此类推.有没有一种有效的方法来完成这个群组功能?

非常感谢你.

-----------------------------关于akrun答案的更多问题.谢谢akrun的回答.我有一个关于"剪切"功能的新问题.如果我的DT如下:

DT <- data.table(A=1:10, B=c(0.01, 0.04, 0.06, 0.09, 0.1, 0.13, 0.14, 0.15, 0.17, 0.71)) 
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

DT %>% 
  group_by(gr=cut(B, breaks= seq(0, 1, by = 0.05), right=F) ) %>% 
  summarise(n= n()) %>%
  arrange(as.numeric(gr))
Run Code Online (Sandbox Code Playgroud)

我希望看到这样的结果:

          gr n
1   [0,0.05) 2
2 [0.05,0.1) 2
3 [0.1,0.15) 3
4 [0.15,0.2) 2
5 [0.7,0.75) 1
Run Code Online (Sandbox Code Playgroud)

但我得到的结果是这样的:

          gr n
1   [0,0.05) 2
2 [0.05,0.1) 2
3 [0.1,0.15) 4
4 [0.15,0.2) 1
5 [0.7,0.75) 1 
Run Code Online (Sandbox Code Playgroud)

看起来值0.15未正确分配.有什么想法吗?

akr*_*run 15

我们可以cut用来进行分组.我们在其中创建'gr'列group_by,用于summarise创建每个group(n())中的元素数量,并arrange根据'gr' 对output()进行排序.

library(dplyr)
 DT %>% 
     group_by(gr=cut(B, breaks= seq(0, 1, by = 0.05)) ) %>% 
     summarise(n= n()) %>%
     arrange(as.numeric(gr))
Run Code Online (Sandbox Code Playgroud)

作为初始对象data.table,这可以使用data.table方法完成(包括@ Frank的建议使用keyby)

library(data.table)
DT[,.N , keyby = .(gr=cut(B, breaks=seq(0, 1, by=0.05)))]
Run Code Online (Sandbox Code Playgroud)

编辑:

根据OP的帖子中的更新,我们可以减去一小部分 seq

lvls <- levels(cut(DT$B, seq(0, 1, by =0.05)))
DT %>%
   group_by(gr=cut(B, breaks= seq(0, 1, by = 0.05) -
                 .Machine$double.eps, right=FALSE, labels=lvls)) %>% 
   summarise(n=n()) %>% 
   arrange(as.numeric(gr))
#          gr n
#1   (0,0.05] 2
#2 (0.05,0.1] 2
#3 (0.1,0.15] 3
#4 (0.15,0.2] 2
#5 (0.7,0.75] 1
Run Code Online (Sandbox Code Playgroud)

  • 这很棒.我使用的一个有用的值是我的特定数据集的"Inf",只想与大家分享.例如,`breaks = c(1,5,10,Inf)`将包括5和更高版本. (2认同)