【问题标题】:divide a range of values in bins of equal length: cut vs cut2在等长的 bin 中划分一系列值:cut vs cut2
【发布时间】:2011-08-20 10:19:39
【问题描述】:

我正在使用 cut 函数将我的数据拆分为相等的 bin,它可以完成这项工作,但我对它返回值的方式不满意。我需要的是垃圾箱的中心,而不是上下两端。
我也尝试使用cut2{Hmisc},这给了我每个箱的中心,但它划分了箱中包含相同数量的观察值的数据范围,而不是相同的长度。

有没有人可以解决这个问题?

【问题讨论】:

    标签: r hmisc


    【解决方案1】:

    像这样使用ave

    set.seed(21)
    x <- sample(0:20, 100, replace=TRUE)
    xCenter <- ave(x, cut(x,3), FUN=median)
    

    【讨论】:

      【解决方案2】:

      用这样的东西自己做休息和标签并不难。由于中点是一个数字,因此我实际上并没有返回带有标签的因子,而是返回一个数字向量。

      cut2 <- function(x, breaks) {
        r <- range(x)
        b <- seq(r[1], r[2], length=2*breaks+1)
        brk <- b[0:breaks*2+1]
        mid <- b[1:breaks*2]
        brk[1] <- brk[1]-0.01
        k <- cut(x, breaks=brk, labels=FALSE)
        mid[k]
      }
      

      可能有更好的方法来获取垃圾箱中断和中点;我没有仔细考虑。

      请注意,此答案与 Joshua 的不同;他给出了每个 bin 中数据的中位数,而 this 给出了每个 bin 的中心。

      > head(cut2(x,3))
      [1] 16.666667  3.333333 16.666667  3.333333 16.666667 16.666667
      > head(ave(x, cut(x,3), FUN=median))
      [1] 18  2 18  2 18 18
      

      【讨论】:

        【解决方案3】:

        我们可以使用包cutr中的smart_cut

        devtools::install_github("moodymudskipper/cutr")
        library(cutr)
        

        使用@Joshua 的示例数据:

        间隔中位数(与@Joshua 相同的输出,除了它是一个有序因子):

        smart_cut(x,3, "n_intervals", labels= ~ median(.))
        # [1] 18 2  18 2  18 18 ...
        # Levels: 2 < 11 < 18
        

        每个区间的中心(与@Aaron 相同的输出,除了它是一个有序因子):

        smart_cut(x,3, "n_intervals", labels= ~ mean(.y))
        # [1] 16.67 3.333 16.67 3.333 16.67 16.67 ...
        # Levels: 3.333 < 10 < 16.67
        

        按区间的平均值:

        smart_cut(x,3, "n_intervals", labels= ~ mean(.))
        # [1] 17.48 2.571 17.48 2.571 17.48 17.48 ...
        # Levels: 2.571 < 11.06 < 17.48
        

        labels 可以像 base::cut.default 一样是字符向量,但也可以是 2 个参数的函数,第一个是 bin 中包含的值,第二个是 cut垃圾箱的点。

        more on cutr and smart_cut

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-15
          • 2012-02-05
          • 1970-01-01
          相关资源
          最近更新 更多