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

Mic*_*ams 32 sql r binning dplyr

有没有办法做一些类似于cut()dplyr表中装箱数值的函数?我正在研究一个大的postgres表,并且当前可以在一开始就在sql中编写case语句,或者输出非聚合数据并应用cut().两者都有明显的缺点...案例陈述不是特别优雅,并且通过collect()根本没有效率地提取大量记录.

drh*_*gen 38

对于通过搜索引擎到达这里的其他人来说,这是一个直接的答案,n-break形式cut现在实现为以下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
Run Code Online (Sandbox Code Playgroud)

  • 严格来说,这不是任意中断的一般`cut()`函数,它只适用于ntiles(*"粗略排名,将输入向量分解为'n'桶"*) (5认同)

小智 11

以下适用于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) )
Run Code Online (Sandbox Code Playgroud)


hmh*_*sen 7

我看到这个问题从来没有用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]
Run Code Online (Sandbox Code Playgroud)

您还可以使用 指定 bin 宽度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]
Run Code Online (Sandbox Code Playgroud)