为R中的范围创建两个不同变量的bin间隔

时间:2018-05-14 17:20:26

标签: r

我想为产品类别同时创建两个bin间隔,一个用于“Sales”,另一个用于“PCT更改”。 “PCT变更”从-ve到+ ve不等,销售额从2000美元到19000美元不等。

以下是我的数据集。

Product,Sales,PCT Change
A,4769,0.72
A,9841,0.14
A,2594,-0.37
A,15970,-0.76
A,18142,0.9
A,19935,0.63
A,19023,0.63
A,4097,-0.31
A,17318,-0.38
A,15533,1.14
A,7596,0.74
A,4099,0.06
B,7294,-0.45
B,5473,-0.81
B,5813,-0.31
B,4084,0.8
B,10446,0.08
B,3820,0.12
B,3208,0.02
B,10100,-0.82
B,19125,0.14
B,7332,0.9
C,1870,0.28
C,5949,-0.62
C,2739,0.98
C,14388,0
C,19307,1.08
C,12312,0.68
C,15120,0.08
C,16456,0.24
C,1063,0.64
C,3587,-0.07
C,15480,0.31
C,8934,0.79
C,10392,0.57
C,9705,0.87
C,18181,0.93
C,4700,-0.88
C,7392,-0.79
C,7504,-0.75
C,14943,1.06

以下是我正在尝试的代码。

df %>%
group_by(Product) %>%
mutate(freq=cut(Sales, breaks=seq(0,8000,by=50), include.lowest=TRUE))

我不确定休息时间会如何帮助..我不想创建超过10个不同的bin。此外,不确定如何在同一代码中附加“PCT变更”,以引入两个不同的间隔。

预期产出:

Product,Sales,PCT Change
    A,4769,0.72, [4000-5000],[0.65-0.78]
    A,9841,0.14 ,[9000-10000],[0.04-0.17]
    B,2594,-0.37,[2000-3000],[-0.39- -0.31]

此外,我正在寻找自定义范围的选项,假设我想带4500-5000而不是4000-5000。我实际上正在运行模拟,因此想要探索可行的选项。

任何线索都会受到高度赞赏。

谢谢, Ĵ

2 个答案:

答案 0 :(得分:1)

data.table的潜在解决方案

如果您想检查数据以找到合适的分档,或者您只是想过滤数据,那么不是绝对肯定的。这个解决方案解决了前者 - 如果这不是你想要的,那么编辑你的问题,我将更新我的解决方案。

library(data.table)


DT[, sales.bins := paste0(round(floor(Sales), -3)-1000, "-", round(ceiling(Sales),-3)+1000)]
DT[, PCT.change.bins := paste0(floor(`PCT Change`)-1, "-", ceiling(`PCT Change`))]

这会产生以下输出:

> DT
    Product Sales PCT Change  sales.bins PCT.change.bins
 1:       A  4769       0.72   4000-6000            -1-1
 2:       A  9841       0.14  9000-11000            -1-1
 3:       A  2594      -0.37   2000-4000            -2-0
 4:       A 15970      -0.76 15000-17000            -2-0
 5:       A 18142       0.90 17000-19000            -1-1
 6:       A 19935       0.63 19000-21000            -1-1
 7:       A 19023       0.63 18000-20000            -1-1
 8:       A  4097      -0.31   3000-5000            -2-0
 9:       A 17318      -0.38 16000-18000            -2-0
10:       A 15533       1.14 15000-17000             0-2
11:       A  7596       0.74   7000-9000            -1-1
12:       A  4099       0.06   3000-5000            -1-1
13:       B  7294      -0.45   6000-8000            -2-0
14:       B  5473      -0.81   4000-6000            -2-0
15:       B  5813      -0.31   5000-7000            -2-0
16:       B  4084       0.80   3000-5000            -1-1
17:       B 10446       0.08  9000-11000            -1-1
18:       B  3820       0.12   3000-5000            -1-1
19:       B  3208       0.02   2000-4000            -1-1
20:       B 10100      -0.82  9000-11000            -2-0
21:       B 19125       0.14 18000-20000            -1-1
22:       B  7332       0.90   6000-8000            -1-1
23:       C  1870       0.28   1000-3000            -1-1
24:       C  5949      -0.62   5000-7000            -2-0
25:       C  2739       0.98   2000-4000            -1-1
26:       C 14388       0.00 13000-15000            -1-0
27:       C 19307       1.08 18000-20000             0-2
28:       C 12312       0.68 11000-13000            -1-1
29:       C 15120       0.08 14000-16000            -1-1
30:       C 16456       0.24 15000-17000            -1-1
31:       C  1063       0.64      0-2000            -1-1
32:       C  3587      -0.07   3000-5000            -2-0
33:       C 15480       0.31 14000-16000            -1-1
34:       C  8934       0.79  8000-10000            -1-1
35:       C 10392       0.57  9000-11000            -1-1
36:       C  9705       0.87  9000-11000            -1-1
37:       C 18181       0.93 17000-19000            -1-1
38:       C  4700      -0.88   4000-6000            -2-0
39:       C  7392      -0.79   6000-8000            -2-0
40:       C  7504      -0.75   7000-9000            -2-0
41:       C 14943       1.06 14000-16000             0-2
    Product Sales PCT Change  sales.bins PCT.change.bins

使用以下内容查找唯一的分类:

> unique(DT$sales.bins)
 [1] "4000-6000"   "9000-11000"  "2000-4000"   "15000-17000" "17000-19000" "19000-21000" "18000-20000" "3000-5000"   "16000-18000"
[10] "7000-9000"   "6000-8000"   "5000-7000"   "1000-3000"   "13000-15000" "11000-13000" "14000-16000" "0-2000"      "8000-10000" 

> unique(DT$PCT.change.bins)
[1] "-1-1" "-2-0" "0-2"  "-1-0"

答案 1 :(得分:0)

扩展您在问题中使用的方法:

sales_bin_size = 1000    

df %>%
    group_by(Product) %>%
    mutate(Sales_bin=cut(Sales, breaks=seq(0,round(max(Sales), -3),by=sales_bin_size), include.lowest=TRUE),
           PCT_change_bin=cut(`PCT Change`,breaks = 10, include.lowest=TRUE))

您可以使用sales_bin_size来获取所需的容器大小。您可以通过在类似方法中添加新变量来为PCT_change_bin执行相同的操作。