Преобразовать все переменные в факторы, сохраняя уровень NA
Я просмотрел множество тем по этому вопросу, но мне чего-то не хватает - я предполагаю что-то общее в R.
По сути, я хочу преобразовать все переменные в фрейме данных в факторы, а также сделать дополнительный уровень NA.
#Creating Data Frame
data<-data.frame(var1=c(1,2,3,3,3,4,NA),var2=c("a","b","c","d",NA,"a","b"))
Если я бегу factor
работает только с одной переменной, используя опцию exclude:
levels(factor(data$var1,exclude=NULL))
[1] "1" "2" "3" "4" NA
Если я использую apply
кажется, что эта информация потеряна. Это может быть связано с приведением matrix-data.frame
Я попробовал оба:
data.factors<-data.frame(apply(data, 2,x,exclude=NULL))
data.factors<-data.frame(apply(data, 2, function(x) factor(x,exclude=NULL)))
и результаты без NA как отдельный уровень:
levels(x.factors$var1)
[1] " 1" " 2" " 3" " 4"
Затем я могу добавить на отдельном этапе новый уровень для NA, но это увеличит объем сценариев, и я надеялся, что это можно сделать за один шаг? Какие-либо предложения?
(Прошу прощения, если ответ легко доступен - я просмотрел много тем и не нашел его)
1 ответ
Если вы не работаете на matrix
/array
или делать операции по строкам, избегать apply
любой ценой из-за его преобразования в матрицу.
lapply
избегает преобразования части и является гораздо более эффективным. Вы также можете обновить исходный набор данных, используя []
который сохраняет исходную структуру вашего набора данных и избегает преобразования его обратно в список, как в
data[] <- lapply(data, factor, exclude = NULL)
Затем вы можете проверить
lapply(data, levels)
# $var1
# [1] "1" "2" "3" "4" NA
#
# $var2
# [1] "a" "b" "c" "d" NA
В качестве бонуса вы также можете попробовать data.table::set
функция, которая является моей предпочтительной рабочей лошадкой для таких операций
library(data.table)
for(j in names(data)) set(data, j = j, value = factor(data[[j]], exclude = NULL))
Код сложнее понять, но он должен быть очень эффективным, когда вы имеете дело с огромными наборами данных.