【问题标题】:Segregate data into 4 equal percentage chunks将数据分成 4 个相等百分比的块
【发布时间】:2017-10-16 11:00:59
【问题描述】:

我需要根据基于Qty_ordered 的降序百分比将数据分成 4 个相等的块。我尝试在 R 中使用 'bins.quantiles'function (来自 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

【问题讨论】:

  • 使用cutfindInterval 创建群组
  • 如果第 1 类有 5 个块,而第 4 类只有 3 个,那么这些块如何相等?如果有 18 个条目,你想如何使块相等?
  • @guscht ,订单数量降序排列的前 25% 进入第 1 类,接下来 25% 进入第 2 类,以此类推

标签: r python-3.x data.table


【解决方案1】:

也许是这个?

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

【讨论】:

  • 您可能希望查看?setorder?fread?.N?.I 以了解一些替代方案。
  • 嗨弗兰克,感谢您的建议。我调整了答案。如果您有进一步的建议,请不要犹豫。 :)
  • @guscht,我们可以使用 smbinning.factor 来做同样的事情吗
  • @pankaj,我不知道该功能,??smbinning 不返回任何结果。它来自哪个包?我总是尝试使用尽可能少的包......我认为在这种情况下,我会坚持使用 data.table 而不会引入额外的包。
  • @guscht,它来自图书馆(smbinning)。 cran.r-project.org/web/packages/smbinning/smbinning.pdf
【解决方案2】:

这是使用 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)

【讨论】:

  • 我们也可以使用 smbinning.factor 包吗
  • @pankaj smbinning 包要求您有一个二进制 (0,1) 变量,该变量与您要合并的变量相关联。您发布的数据集没有二进制 (0,1) 变量
  • ,如何在这个数据集上应用 smbinning.factor :dropbox.com/s/s0tjzik0sbdkqpi/Test.csv?dl=0
猜你喜欢
  • 1970-01-01
  • 2021-06-02
  • 2019-05-06
  • 1970-01-01
  • 2013-07-04
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多