Вновь созданный фрейм данных теряет метки для категорий своих векторов.

У меня есть такой фрейм данных:

> str(dynamics)
'data.frame':   3517 obs. of  3 variables:
 $ id   : int  1 2 3 4 5 6 7 8 9 10 ...
 $ y2015: int  245 129 301 162 123 125 115 47 46 135 ...
 $ y2016: int  NA 385 420 205 215 295 130 NA NA 380 ...

Я беру 3 вектора и называю их по-разному.
Столбец 1:

> plantid <- dynamics$id
> head(plantid)
[1] 1 2 3 4 5 6

Столбец 2:
(я делю его на разные классы и обозначаю их 2,3,4 и 5)

> y15 <- dynamics$y2015
> year15 <- cut(y15, breaks = c(-Inf, 50, 100, 150, Inf), labels = c("2", "3", "4", "5"))
> str(year15)
 Factor w/ 4 levels "2","3","4","5": 4 3 4 4 3 3 3 1 1 3 ...
> head(year15)
[1] 5 4 5 5 4 4
Levels: 2 3 4 5

Столбец 3:
(то же самое здесь)

> y16 <- dynamics$y2016
> year16 <- cut(y16, breaks = c(-Inf, 50, 100, 150, Inf), labels = c("2", "3", "4", "5"))
> str(year16)
 Factor w/ 4 levels "2","3","4","5": NA 4 4 4 4 4 3 NA NA 4 ...
> head(year16)
[1] <NA> 5    5    5    5    5   
Levels: 2 3 4 5

Все идет нормально!

Проблема возникает, когда я объединяю 3 вышеуказанных вектора с помощью cbind() для формирования нового фрейма данных, вновь созданные уровни векторов исчезают

Посмотрите на мой код:

SD1 = data.frame(cbind(plantid, year15, year16))
head(SD1)

и я получаю такой кадр данных:

> head(SD1)
  plantid year15 year16
1       1      4     NA
2       2      3      4
3       3      4      4
4       4      4      4
5       5      3      4
6       6      3      4

как вы можете видеть, уровни 2-го и 3-го столбца изменились с 2, 3, 4, 5 обратно на 1, 2, 3, 4
Как мне это исправить?


person Muneer    schedule 09.05.2018    source источник


Ответы (1)


cbind чаще всего используется для объединения объектов в матрицы. Он удаляет специальные атрибуты из входных данных, чтобы обеспечить их совместимость для объединения в один объект. Это означает, что типы данных со специальными атрибутами (такими как атрибуты имени и формата для факторов и дат) будут упрощены до их базовых числовых представлений. Вот почему cbind превращает ваши факторы в числа.

И наоборот, data.frame() сам по себе сохранит отдельные атрибуты объекта. В этом случае вам не нужно использовать cbind. Чтобы сохранить уровни факторов, просто используйте:

SD1 <- data.frame(plantid, year15, year16)
person jdobres    schedule 09.05.2018
comment
@ jdobres, Большое спасибо за такое любезное объяснение. Я сделал это. - person Muneer; 09.05.2018