Я пытаюсь разделить столбец чисел на 6 равных категорий, если число больше 0.
это пробовали
if (nost13$actsum > 0) nost13$actclass2 <- as.factor( as.numeric( cut(nost13$actsum ,6)))
else 0
Хотя не работает...
Что случилось?
Я пытаюсь разделить столбец чисел на 6 равных категорий, если число больше 0.
это пробовали
if (nost13$actsum > 0) nost13$actclass2 <- as.factor( as.numeric( cut(nost13$actsum ,6)))
else 0
Хотя не работает...
Что случилось?
Возможно, это непроверенный ответ. Протестированные решения могут быть предоставлены, если вы сначала предоставите объект данных. Существует также двусмысленность в отношении того, что может представлять собой «равная категория». Равные значения? Или равный пролет? Это соответствует равному промежутку времени, что и 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
, у которого по умолчанию закрыты интервалы справа.
if
. В R он не действует на векторы, как должно было быть указано в предупреждающем сообщении. - person IRTFM   schedule 15.05.2016?ifelse
; (2) если это не отвечает на ваш вопрос, не могли бы вы включить данные, которые предоставят нам воспроизводимый пример ? - person Ben Bolker   schedule 15.05.2016