Изменение непрерывных диапазонов на категориальные в R

Я пытался преобразовать некоторые непрерывные целые числа в категориальные диапазоны, но произошло что-то, чего я не понял. Хоть я и исправил, чтобы получить то, что хочу, я до сих пор не понимаю, почему это произошло.

Переменная представляет собой несколько целых чисел от 0 до 12, следующий код оставил 10,11,12 вне категории 5+.

py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==0]<-"0"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==1]<-"1"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==2]<-"2"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==3]<-"3"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==4]<-"4"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain>=5]<-"5+"
py2$Daily.Whole.Grain<-as.factor(py2$Daily.Whole.Grain)

Но когда я меняю порядок преобразования, он включает 10,11,12.

py2$Daily.Whole.Grain[py2$Daily.Whole.Grain>=5]<-"5+"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==0]<-"0"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==1]<-"1"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==2]<-"2"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==3]<-"3"
py2$Daily.Whole.Grain[py2$Daily.Whole.Grain==4]<-"4"

Может ли кто-нибудь объяснить, почему он оставляет двузначные целые числа? Большое спасибо.


person user2935184    schedule 24.03.2015    source источник
comment
вы меняете свою переменную на character, и вы можете проверить "10" > "5", она даст FALSE, следовательно, отсутствие 10, 11 и 12 (но 52 будет включено). Лучше всего было бы создать другую переменную вместо изменения существующей (и вы можете не делать этого в 6 строках), или вы можете использовать as.integer, если вы действительно хотите изменить свою переменную.   -  person Cath    schedule 24.03.2015
comment
на самом деле, вы можете просто сделать py2$Daily.Whole.Grain[py2$Daily.Whole.Grain>=5]<-"5+", чтобы получить то, что вы хотите, поскольку другое значение просто преобразуется в символ   -  person Cath    schedule 24.03.2015


Ответы (1)


Как уже упоминалось @CathG, проблема связана с преобразованием столбца из класса numeric в character. Вот, пожалуй, лучшее решение с использованием функции cut, которая даст вам коэффициенты, основанные на точках отсечки переменной:

py2 <- data.frame(Daily.Whole.Grain = 1:10)
py2$Daily.Whole.Grain1 <- cut(py2$Daily.Whole.Grain, 
    breaks = c(1:5, Inf), right = FALSE, labels = c(1:4, "5+"))
py2
   Daily.Whole.Grain Daily.Whole.Grain1
1                  1                  1
2                  2                  2
3                  3                  3
4                  4                  4
5                  5                 5+
6                  6                 5+
7                  7                 5+
8                  8                 5+
9                  9                 5+
10                10                 5+
person Jeff    schedule 24.03.2015
comment
Спасибо, Джефф, я не хотел использовать функцию вырезания, потому что мне нужны были более красивые категориальные имена. Второй комментарий @CathG действительно помогает мне понять, что происходит. Спасибо вам обоим. - person user2935184; 24.03.2015
comment
Добро пожаловать. Вы также можете добавить labels = c(1:4, "5+") к функции cut, чтобы получить то, что хотите, но решение @CathG немного короче! (Я отредактировал свой ответ, чтобы иметь это). - person Jeff; 24.03.2015