Binning числовой переменной в R - PullRequest
11 голосов
/ 24 марта 2010

У меня есть вектор X, который содержит положительные числа, которые я хочу сгруппировать / дискретизировать. Для этого вектора я хочу, чтобы числа [0, 10) отображались так же, как они существуют в векторе, но числа [10, & infin;) должны быть 10+.

Я использую:

x <- c(0,1,3,4,2,4,2,5,43,432,34,2,34,2,342,3,4,2)
binned.x <- as.factor(ifelse(x > 10,"10+",x))

но мне это кажется клугем. Кто-нибудь знает лучшее решение или другой подход?

Ответы [ 3 ]

20 голосов
/ 24 марта 2010

Как насчет cut:

binned.x <- cut(x, breaks = c(-1:9, Inf), labels = c(as.character(0:9), '10+'))

Что дает:

 # [1] 0   1   3   4   2   4   2   5   10+ 10+ 10+ 2   10+ 2   10+ 3   4   2  
 # Levels: 0 1 2 3 4 5 6 7 8 9 10+
7 голосов
/ 24 марта 2010

Ваш вопрос противоречив.
В описании 10 относится к группе "10+", а в коде 10 - отдельный уровень. Если 10 должен быть в группе "10+", тогда ваш код должен быть

as.factor(ifelse(x >= 10,"10+",x))

В этом случае вы можете усечь данные до 10 (если вам не нужен коэффициент):

pmin(x, 10)
# [1]  0  1  3  4  2  4  2  5 10 10 10  2 10  2 10  3  4  2 10
2 голосов
/ 24 марта 2010
x[x>=10]<-"10+"

Это даст вам вектор строк. Вы можете использовать as.numeric(x) для преобразования обратно в числа («10+» становится NA) или as.factor(x), чтобы получить результат выше.

Обратите внимание, что это изменит сам исходный вектор, поэтому вы можете скопировать его в другой вектор и поработать над этим.

...