【问题标题】:How to cut a vector into groups with equal number of observations in R?如何将向量分成具有R中相同数量观察值的组?
【发布时间】:2021-11-04 00:12:04
【问题描述】:

如何将向量分成包含 R 中大致相等数量的观察值的组?我还需要知道什么是切点值,以便对未来的输入进行分类。

因此,基本上,我正在尝试将连续变量转换为每个类别中具有相同数量观察值的分类变量。我需要知道每个类别的边界。请帮忙。

例如:

bla <- c(1,2,3,4,5,6,7,8,9,10,11,12)
blaClass <- cut(bla, 3)

每个 blaClass 包含相同数量的观察值。但问题是我有许多观察值非常接近,甚至具有相同的值,因此很难将它们分成具有相同观察值的组。

我尝试使用 quantileCut,但它给了我“中断不是唯一的”错误。

【问题讨论】:

  • 举一个假的例子。

标签: r classification categorical-data quantile


【解决方案1】:

您可以使用dplyr::ntile() 将它们切割成分位数。例如,

ntile(bla,3)
 [1] 1 1 1 1 2 2 2 2 3 3 3 3

将它们平均削减q(1/3)q(2/3)

【讨论】:

  • 如何获取边框值?
  • @Kaisar 如果你设置 n = 3,Q(1/3) 和 Q(2/3) 是边界
  • 那么一个类别中的最大值是边框?该函数没有设置其他边框值?
【解决方案2】:

我认为cut 已经按照您的预期工作,返回的标签不容易阅读。你可以用labels = FALSE关闭标签

bla <- c(1,2,3,4,5,6,7,8,9,10,11,12)
blaClass <- cut(bla, 3, labels = FALSE)
blaClass
#[1] 1 1 1 1 2 2 2 2 3 3 3 3

【讨论】:

    【解决方案3】:

    使用我的santoku 包:

    library(santoku)
    bla <- c(1,2,3,4,5,6,7,8,9,10,11,12)
    chop_equally(bla, 3)
    

    也适用于许多靠近在一起的数字:

    bla <- rep(1:5, 5) + rnorm(25)/1e8
    table(chop_equally(bla, 5, lbl_intervals(raw = TRUE)))
    
    ##  [1, 1.8) [1.8, 2.6) [2.6, 3.4) [3.4, 4.2)   [4.2, 5] 
    ##         5          5          5          5          5 
    

    【讨论】:

    • 谢谢。它几乎适用于所有事情。但是它不适用于我的 df 中的一列。它只是把它切成了一个。为什么?
    • 我不知道!该列是否有足够的不同值可以分成 n 组?
    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多