dplyr中是否提供cut()样式分箱?

时间:2014-02-11 22:27:18

标签: sql r dplyr binning

有没有办法像cut()函数那样对dplyr表中的数值进行分箱?我正在处理一个大的postgres表,并且当前可以在开始时在sql中编写case语句,或者输出未聚合的数据并应用cut()。两者都有明显的缺点...案例陈述不是特别优雅,并且通过collect()提取大量记录根本没有效率。

3 个答案:

答案 0 :(得分:36)

对于通过搜索引擎到达此处的其他人,我们立即得到答案,cut的n-break表单现在已作为ntile中的dplyr函数实现:

> data.frame(x = c(5, 1, 3, 2, 2, 3)) %>% mutate(bin = ntile(x, 2))
  x bin
1 5   2
2 1   1
3 3   2
4 2   1
5 2   1
6 3   2

答案 1 :(得分:2)

假设dplyr是我们希望合并的变量,以下内容适用于x

# Make n bins
df %>% mutate( x_bins = cut( x, breaks = n )

# Or make specific bins
df %>% mutate( x_bins = cut( x, breaks = c(0,2,6,10) )

答案 2 :(得分:2)

我看到这个问题从未使用tidyverse解决方案进行过更新,因此我将其添加为后代。

要使用的功能是cut_interval包中的ggplot2。它的工作方式与base::cut类似,但是根据我的经验,它在标记起点和终点方面做得比base函数更好,因为cut在两端增加了0.1%的范围。

data.frame(x = c(5, 1, 3, 2, 2, 3)) %>% mutate(bin = cut_interval(x, n = 2))
  x   bin
1 5 (3,5]
2 1 [1,3]
3 3 [1,3]
4 2 [1,3]
5 2 [1,3]
6 3 [1,3]

您还可以使用cut_width指定垃圾箱宽度。

data.frame(x = c(5, 1, 3, 2, 2, 3)) %>% mutate(bin = cut_width(x, width = 2, center = 1))
  x   bin
1 5 (4,6]
2 1 [0,2]
3 3 (2,4]
4 2 [0,2]
5 2 [0,2]
6 3 (2,4]