Как назначить в рамках заявленной семьи? - PullRequest
5 голосов
/ 27 февраля 2012

У меня есть data.frame, который содержит несколько факторов, и я хочу переименовать уровни факторов для всех этих факторов.Например:

mydf <- data.frame(col1 = as.factor(c("A","A",NA,NA)),col2 = as.factor(c("A",NA,NA,"A")))
mydf <- as.data.frame(lapply(mydf,addNA))

Обратите внимание, что пример из реальной жизни имеет больше, чем просто два столбца.Следовательно, я хотел бы использовать apply для назначения имен других уровней всем этим столбцам, как в:

levels(mydf$col1) <- c("1","0") 

Я пробовал следующее, но это не сработало…

 apply(mydf,1,function(x) levels(x) <- c("1","0"))

Я не очень удивлен, что это не работает, но сейчас у меня нет лучших идей.Должен ли я использовать with может быть?

РЕДАКТИРОВАТЬ: я понял, что я сделал ошибку здесь, упрощая вещи.Я использовал addNA для объяснения того факта, что NA больше не должны рассматриваться как NA.Таким образом, я также хочу переименовать их.Это не работает с предложением Андри и возвращает следующее сообщение об ошибке:

 labels = c("1",  : invalid labels; length 2 should be 1 or 1  

Обратите внимание, что я обновил мой пример df.

1 Ответ

8 голосов
/ 27 февраля 2012

Вы можете изменить уровни по ссылке, используя setattr() из пакетов bit или data.table.Это позволяет избежать копирования всего набора данных, и поскольку вы сказали, что у вас много столбцов ...

require(bit)          # Either package
require(data.table)   #
setattr(mydf[[1]],"levels",c("1","0"))
setattr(mydf[[2]],"levels",c("1","0"))

Это можно сделать в простом цикле for, который очень быстр.Вы несете ответственность за то, чтобы заменить вектор уровней вектором одинаковой длины, в противном случае коэффициент может быть недействительным.И вы должны заменить весь вектор уровней этим методом.В data.table есть внутренний способ замены имен определенных уровней ссылками, но, вероятно, нет необходимости заходить так далеко.

...