代码之家  ›  专栏  ›  技术社区  ›  Roman LuÅ¡trik

如何从级别中减去数字

  •  3
  • Roman LuÅ¡trik  · 技术社区  · 16 年前

    我想削减一个向量的值范围从0-70到x的类别数,并希望每个类别的上限。到目前为止,我已经用 cut() 我试图从水平面上提取极限。 我有一个级别列表,我想从中提取每个级别的第二个数字。如何提取 空间 我对哪个号码感兴趣?

    我有:

    > levels(bins)
     [1] "(-0.07,6.94]" "(6.94,14]"    "(14,21]"      "(21,28]"      "(28,35]"     
     [6] "(35,42]"      "(42,49]"      "(49,56]"      "(56,63.1]"    "(63.1,70.1]" 
    

    希望得到:

    [1] 6.94 14 21 28 35 42 49 56 63.1 70.1
    

    或者有没有更好的方法来计算类别的上界?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Yorgos    16 年前

    这可能是一个解决方案

    k <- sub("^.*\\,","", levels(bins))
    as.numeric(substr(k,1,nchar(k)-1))
    

     [1]  6.94 14.00 21.00 28.00 35.00 42.00 49.00 56.00 63.10 70.10
    
        2
  •  1
  •   Marek    16 年前

    如果你想要精确的断裂值,那么你应该自己计算,因为 cut 间隔的舍入限制:

    x <- seq(0,1,by=.023)
    levels(cut(x, 4))
    # [1] "(-0.000989,0.247]" "(0.247,0.494]"     "(0.494,0.742]"     "(0.742,0.99]"     
    levels(cut(x, 4, dig.lab=10))
    # [1] "(-0.000989,0.2467555]" "(0.2467555,0.4945]"    "(0.4945,0.7422445]"   
    # [4] "(0.7422445,0.989989]" 
    

    cut.default 怎样 breaks 正在计算:

    if (length(breaks) == 1L) {
        if (is.na(breaks) | breaks < 2L) 
            stop("invalid number of intervals")
        nb <- as.integer(breaks + 1)
        dx <- diff(rx <- range(x, na.rm = TRUE))
        if (dx == 0) 
            dx <- abs(rx[1L])
        breaks <- seq.int(rx[1L] - dx/1000, rx[2L] + dx/1000, 
            length.out = nb)
    }
    

    compute_breaks <- function(x, breaks) 
        if (length(breaks) == 1L) {
            if (is.na(breaks) | breaks < 2L) 
                stop("invalid number of intervals")
            nb <- as.integer(breaks + 1)
            dx <- diff(rx <- range(x, na.rm = TRUE))
            if (dx == 0) 
                dx <- abs(rx[1L])
            breaks <- seq.int(rx[1L] - dx/1000, rx[2L] + dx/1000, 
                length.out = nb)
                breaks
        }
    

    结果是

    compute_breaks(x,4)
    # [1] -0.000989  0.246755  0.494500  0.742244  0.989989