Преобразовать все переменные в факторы, сохраняя уровень 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))

Код сложнее понять, но он должен быть очень эффективным, когда вы имеете дело с огромными наборами данных.

Другие вопросы по тегам