как вычитать числа из уровней

Я хотел бы вырезать вектор значений в диапазоне от 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

Или есть лучший способ расчета верхних границ категорий?


person Roman Luštrik    schedule 09.06.2010    source источник


Ответы (2)


Это может быть одним из решений

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
person George Dontas    schedule 09.06.2010
comment
Итак, если я правильно понимаю, строка шаблона говорит опустить все, что осталось от запятой, и обрезать пробелы? - person Roman Luštrik; 09.06.2010
comment
Первая команда заменяет все до , ничем (). Второй берет подстроку длины n-1 (чтобы опустить завершающий ]) - person George Dontas; 09.06.2010
comment
на самом деле '\\' в ^.*\\ не нужен, и подход с полным регулярным выражением, хотя я не рекомендую, если вы не знакомы с регулярным выражением, просто: sub(.*,(.*)],\ \1, уровни(ячейки)) - person kohske; 09.06.2010

Если вам нужны точные значения перерывов, вы должны вычислить их самостоятельно, задав 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
person Marek    schedule 09.06.2010