если еще и разделить на категории в r

Я пытаюсь разделить столбец чисел на 6 равных категорий, если число больше 0.

это пробовали

if (nost13$actsum > 0) nost13$actclass2 <- as.factor( as.numeric( cut(nost13$actsum ,6)))
else 0

Хотя не работает...

Что случилось?


person Vestlink    schedule 15.05.2016    source источник
comment
Первое, что неправильно, это использование if. В R он не действует на векторы, как должно было быть указано в предупреждающем сообщении.   -  person IRTFM    schedule 15.05.2016
comment
ок :-) Тогда как это сделать??   -  person Vestlink    schedule 15.05.2016
comment
(1) см. ?ifelse; (2) если это не отвечает на ваш вопрос, не могли бы вы включить данные, которые предоставят нам воспроизводимый пример ?   -  person Ben Bolker    schedule 15.05.2016
comment
Возможный дубликат Лучший способ заменить длинную структуру ifelse в Р   -  person MichaelChirico    schedule 15.05.2016
comment
плохо смотреть в ifelse   -  person Vestlink    schedule 15.05.2016


Ответы (1)


Возможно, это непроверенный ответ. Протестированные решения могут быть предоставлены, если вы сначала предоставите объект данных. Существует также двусмысленность в отношении того, что может представлять собой «равная категория». Равные значения? Или равный пролет? Это соответствует равному промежутку времени, что и cut.

 nost13$actclass2 <- ifelse(nost13$actsum > 0,
                                 cut(nost13$actsum ,6), 0)

Я подозреваю, что принуждение к числовому будет происходить внутри ifelse. Ваш код попытался бы добавить 0 к факторам, что закончилось бы слезами. Если вы хотите, чтобы это был фактор с уровнями "0"-"6", то оберните все ifelse(....) в factor(.).

Вот небольшое легкое тестирование:

 actclass2 <- ifelse(-100:100 > 0,
                                  cut(-100:100 ,6), 0)
 table(actclass2)
#------------
actclass2
  0   4   5   6 
101  33  33  34 

Таким образом, в зависимости от распределения значений вы могли получить не совсем то, что хотели. Это показывает модификацию этой стратегии, которая, вероятно, будет более приятной:

> vals <- -100:100
> splits <- seq(min(vals[vals>0]),max(vals[vals>0]), length=8)[-8]
> actclass2 <- ifelse(vals > 0,
+                           cut(vals ,breaks=splits ), 0)
> table(actclass2)
actclass2
  0   1   2   3   4   5   6 
101  14  14  14  14  14  14 

Нужна последовательность длины = 8, чтобы получить 6 интервалов с разрезом, так как максимальное значение было отброшено, и нужно 7 границ, чтобы сгенерировать 6 интервалов. Пройдя через это, я думаю, что функция findInterval даст более четкий путь к успеху.

> table( findInterval( vals, c(-Inf, 0, splits[-1], Inf) ))

  1   2   3   4   5   6   7   8 
100  16  14  14  14  14  14  15 

findInterval имеет закрытые интервалы слева по сравнению с cut, у которого по умолчанию закрыты интервалы справа.

person IRTFM    schedule 15.05.2016