R 将数据分隔为4个相等百分比的数据块

R 将数据分隔为4个相等百分比的数据块,r,python-3.x,data.table,R,Python 3.x,Data.table,我需要根据百分比将数据分成4个相等的数据块,并根据Qty\u ordered按降序排列。我尝试在R中使用'bins.quantiles'函数(来自binr包),但不起作用。还有其他可以使用的方法吗 Input SL.No Item Qty_Ordered 1 VT25 2 2 VT58 4 3 VT40 10 4 VT58 2 5 VT 69 1

我需要根据百分比将数据分成4个相等的数据块,并根据
Qty\u ordered
按降序排列。我尝试在R中使用
'bins.quantiles'
函数(来自binr包),但不起作用。还有其他可以使用的方法吗

     Input

     SL.No  Item Qty_Ordered
        1   VT25    2
        2   VT58    4
        3   VT40    10
        4   VT58    2
        5   VT 69   12
        6   VT 67   6
        7   VT45    21
        8   VT 25   16
        9   VT 40   24
        10  VT98    10
        11  VT78    18
        12  VT40    6
        13  VT 25   26
        14  VT85    6
        15  VT78    10
        16  VT25    4
        17  VT40    15
        18  VT69    24

            Output
  SL.No Item Qty Ordered    Class
    1   VT25    2         1
   4    VT58    2         1
   2    VT58    4         1
  16    VT25    4         1
   6    VT 67   6         2
  12    VT40    6         2
  14    VT85    6         2
   3    VT40    10        2
  10    VT98    10        2
  15    VT78    10        3
   5    VT 69   12        3
  17    VT40    15        3
   8    VT 25   16        3
  11    VT78    18        3
   7    VT45    21        4
   9    VT 40   24        4
  18    VT69    24        4
  13    VT 25   26        4
也许是这个

library(data.table)
test <- fread(input = "SL.No  Item Qty_Ordered
1   VT25     2
2   VT58     4
3   VT40    10
4   VT58     2
5   VT69    12
6   VT67     6
7   VT45    21
8   VT25    16
9   VT40    24
10  VT98    10
11  VT78    18
12  VT40     6
13  VT25    26
14  VT85     6
15  VT78    10
16  VT25     4
17  VT40    15
18  VT69    24", header = T)
setorder(test, Qty_Ordered)
test[, Class := .I %/% ((.N+1)/4) + 1]
test
#     SL.No Item Qty_Ordered Class
#  1:     1 VT25           2     1
#  2:     4 VT58           2     1
#  3:     2 VT58           4     1
#  4:    16 VT25           4     1
#  5:     6 VT67           6     2
#  6:    12 VT40           6     2
#  7:    14 VT85           6     2
#  8:     3 VT40          10     2
#  9:    10 VT98          10     2
# 10:    15 VT78          10     3
# 11:     5 VT69          12     3
# 12:    17 VT40          15     3
# 13:     8 VT25          16     3
# 14:    11 VT78          18     3
# 15:     7 VT45          21     4
# 16:     9 VT40          24     4
# 17:    18 VT69          24     4
# 18:    13 VT25          26     4
库(data.table)

测试这里有一种使用tidyverse的方法

library(tidyverse)

df <- read.table(text = "SL.No  Item Qty_Ordered
1   VT25    2
2   VT58    4
3   VT40    10
4   VT58    2
5   VT69   12
6   VT67   6
7   VT45    21
8   VT25   16
9   VT40   24
10  VT98    10
11  VT78    18
12  VT40    6
13  VT25   26
14  VT85    6
15  VT78    10
16  VT25    4
17  VT40    15
18  VT69    24",header = T)

df %>% 
  mutate(Class = findInterval(x = Qty_Ordered, vec = quantile(Qty_Ordered),rightmost.closed = T)) %>%
  arrange(Class)
库(tidyverse)
df%
mutate(Class=findInterval(x=Qty\u Ordered,vec=quantile(Qty\u Ordered),最右边的.closed=T))%>%
安排(班级)

使用
cut
findInterval
创建组显示如果类1中有5个块,但类4中只有3个块,那么块是否相等?如果有18个条目,您希望如何使块相等?@guscht,订单数量降序的前25%进入类别1,下25%进入类别2,因此您可能希望看到
?setorder
?fread
?.N
?.I
,了解一些备选方案。嗨,Frank,谢谢您的建议。我调整了答案。如果您有进一步的建议,请不要犹豫。:)@guscht,我们能用smbining.factor来计算same@pankaj,我不知道该函数,
?smbinning
不会返回任何结果。是哪个包裹寄来的?我总是尽量少用软件包……我想在这种情况下,我只会使用data.table,而不会引入额外的软件包。@guscht,它来自库(smbinning)。我们是否也可以将smbining.factor包用于same@pankajsmbinning软件包要求您拥有一个二进制(0,1)变量,该变量与要存储的变量相关联。您发布的数据集没有二进制(0,1)变量,如何在此数据集上应用smbinning.factor: