R: вырез функции

Вот мои данные:

>my.cut <- cut(my.variable, breaks = c(-Inf, -0.5, -0.25, -0.1, 0, 0.02, 0.05, 0.15, 0.3, 0.5, 1, Inf), right = FALSE)

>levels(my.cut)
    "[-Inf,-0.5)"  "[-0.5,-0.25)"  "[-0.25,-0.1)"  "[-0.1,0)"  "[0,0.02)"  "[0.02,0.05)"  "[0.05,0.15)"  "[0.15,0.3)"  "[0.3,0.5)"  "[0.5,1)"  "[1, Inf)"

Ожидаемый результат:

>levels(my.cut)
    "[-Inf,-0.5)"  "[-0.5,-0.25)" "[-0.25,-0.1)" "[-0.1,0)"  "0"  "(0,0.02)" "[0.02,0.05)"  "[0.05,0.15)"  "[0.15,0.3)"  "[0.3,0.5)"   "[0.5,1)"      "[1, Inf)" 

В ожидаемом результате есть одна цифра 0, которую я хочу выбрать только my.variable==0, но с формулой my.cut нет единственной 0, потому что breaks можно использовать только для интервала. Так как я мог сделать?

Надеюсь получить ваш ответ в ближайшее время! Спасибо!


person velvetrock    schedule 15.07.2015    source источник
comment
@scoa Извините, я не думаю, что вы поняли мой вопрос :( Исходное levels(my.cut) - это "[-Inf,-0.5)" "[-0.5,-0.25)" "[-0.25,-0.1)" "[-0.1,0)" "[0,0.02)" "[0.02,0.05)" "[0.05,0.15)" "[0.15,0.3)" "[0.3,0.5)" "[0.5,1)" "[1, Inf)", в котором нет ни одного 0.   -  person velvetrock    schedule 15.07.2015


Ответы (3)


Вы можете явно поместить каждое значение в группу. Это более гибко, но и намного более многословно.

Одним из способов сделать это может быть определение специальной функции вырезания, а затем применение ее к каждому элементу вашего вектора.

my.variable <- rnorm(100)

bespoke_cut <- function(value){

  if (value < 0.1) return('[-Inf, 0.1)')

  if (value < 0)   return('[0.1, 0)')

  if (value == 0)  return('0')

  return('(0, Inf]')
}

my.cut <- sapply(my.variable, bespoke_cut)

my.cut <- factor(my.cut)

Я сделал только несколько группировок, которые вы хотели, но я думаю, должно быть очевидно, как добавлять дополнительные группы.

person Mhairi McNeill    schedule 15.07.2015

Я думаю, что лучшее, на что вы можете надеяться с помощью «cut», - это указать действительно небольшой диапазон для 0, т. Е.

cps = c(-Inf, -0.1, 0-.Machine$double.eps, 0+.Machine$double.eps, 0.02, Inf)
bgroup = cut(c(-10, 10, 0,0), breaks = cps)
cat(deparse(levels(bgroup)), "\n") ## use this to edit the levels more easily
levels(bgroup) = c("(-Inf, -0.1]", "(-0.1,0)", "0", "(0,0.02]", "(0.02, Inf]")
table(bgroup) 

Очевидно, что уровни отображения не идентичны тем, которые используются для вырезания данных, но если вас устраивает это окно около 0, то решение состоит в том, чтобы сформировать разрезы с этим значением, а затем изменить метки.

person jimmyb    schedule 15.07.2015

Вы можете сделать это: вырезать, присвоить 0, где my.variable == 0, рефакторинг.

my.variable <- rnorm(100)
my.variable[sample(1:100,2)] <- 0
my.cut <- cut(my.variable, breaks = c(-Inf, -0.5, -0.25, -0.1, 0, 0.02, 0.05, 0.15, 0.3, 0.5, 1, Inf), right = FALSE)
lvl <- levels(my.cut)
lvlR <- c(lvl[1:4],"0","(0,0.02)",lvl[6:11])
my.cut <- as.character(my.cut)
my.cut[my.variable == 0] <- 0
my.cut <- factor(my.cut,levels=lvlR)
rm(lvl,lvlR)
person scoa    schedule 15.07.2015