我想根据列的范围值对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)