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