Ответ 1
Я нашел одно решение:
library(data.table)
tst <- data.table('a' = c('b','b','c','c'))
class(tst[,a])
cols <- 'a'
tst[,(cols):=lapply(.SD, as.factor),.SDcols=cols]
Тем не менее, предыдущее поведение кажется ошибочным.
У меня возникла непредвиденная проблема при попытке конвертировать несколько столбцов таблицы данных в столбцы факторов. Я воспроизвел его следующим образом:
library(data.table)
tst <- data.table('a' = c('b','b','c','c'))
class(tst[,a])
tst[,as.factor(a)] #Returns expected result
tst[,as.factor('a'),with=FALSE] #Returns error
Последняя команда возвращает "Ошибка в Math.factor(j): abs не имеет смысла для факторов". Я нашел это при попытке получить tst [, lapply (cols, as.factor), с = FALSE], где cols - это набор строк, которые я пытался преобразовать в факторы. Есть ли какое-либо решение или обходное решение для этого?
Я нашел одно решение:
library(data.table)
tst <- data.table('a' = c('b','b','c','c'))
class(tst[,a])
cols <- 'a'
tst[,(cols):=lapply(.SD, as.factor),.SDcols=cols]
Тем не менее, предыдущее поведение кажется ошибочным.
Теперь это исправлено в v1.8.11, но, вероятно, не так, как вы надеялись, Из НОВОСТИ:
FR # 4867 теперь реализована.
DT[, as.factor('x'), with=FALSE]
гдеx
- столбец вDT
, теперь эквивалентенDT[, "x", with=FALSE]
, а не завершается ошибкой. Благодаря tresbot для отчетности по SO: Преобразование нескольких столбцов data.table в факторы в R
Некоторое объяснение: Разница, когда используется with=FALSE
, заключается в том, что столбцы data.table
больше не рассматриваются как переменные. То есть:
tst[, as.factor(a), with=FALSE] # would give "a" not found!
приведет к ошибке "a" not found
. Но вместо этого вы делаете следующее:
tst[, as.factor('a'), with=FALSE]
Фактически вы создаете фактор "a"
с помощью level="a"
и запрашиваете подмножество этого столбца. Это не имеет особого смысла. Возьмем случай data.frame
s:
DF <- data.frame(x=1:5, y=6:10)
DF[, c("x", "y")] # gives back DF
DF[, factor(c("x", "y"))] # gives back DF again, not factor columns
DF[, factor(c("x", "x"))] # gives back two columns of "x", still integer, not factor!
Итак, в основном, то, на что вы применяете фактор, когда вы используете with=FALSE
, не находится в элементах этого столбца, а просто это имя столбца... Надеюсь, мне удалось передать разницу хорошо, Не стесняйтесь редактировать/комментировать, если есть какие-либо недоразумения.