45

有没有办法做一些类似函数来对表格cut()中的数值进行分箱?dplyr我正在处理一个大型 postgres 表,目前可以在一开始就在 sql 中编写 case 语句,或者输出未聚合的数据并应用cut()collect()两者都有非常明显的缺点...... case 语句不是特别优雅,并且通过完全没有效率来提取大量记录。

4

3 回答 3

43

正因为如此,通过搜索引擎到达这里的其他人可以立即得到答案,n-breaks 形式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
于 2016-05-12T21:16:29.610 回答
11

我看到这个问题从未随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]

您还可以使用 指定 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]
于 2020-09-18T04:17:00.670 回答
8

以下适用于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) )
于 2020-06-24T08:46:49.560 回答