Импорт CSV-файла с использованием fread теряет порядок множителей

Когда я пытаюсь прочитать ранее сохраненный CSV-файл с помощью data.table функции fread, категориальный порядок моих данных не сохраняется. Форматируется в алфавитном порядке.

Чтобы воспроизвести эту проблему, я создал поддельный набор данных, используя data.table.

dat <- data.table(name = c("Joe", "Bob", "Steve", "Lucy", "Eric", "Marshall","Henry"), 
              subject  = as.factor(c(4,1,2,3,4,3,2)))

Используя функцию setattr, я затем помечаю уровни столбца факторов с именем subject.

setattr(dat$subject,
    "levels",
    c("Math","Biology","Sport", "ICT"))

Вот так выглядит набор данных.

       name subject
1:      Joe     ICT
2:      Bob    Math
3:    Steve Biology
4:     Lucy   Sport
5:     Eric     ICT
6: Marshall   Sport
7:    Henry Biology

Я изучаю структуру набора данных и порядок уровней в предметном факторе. Столбец subject является фактором, и уровни находятся в том же порядке, в котором я их установил.

str(dat) 

   Classes ‘data.table’ and 'data.frame':   7 obs. of  2 variables:
 $ name   : chr  "Joe" "Bob" "Steve" "Lucy" ...
 $ subject: Factor w/ 4 levels "Math","Biology",..: 4 1 2 3 4 3 2
 - attr(*, ".internal.selfref")=<externalptr> 

as.ordered(dat$subject)

Levels: Math < Biology < Sport < ICT

Когда я сохраняю набор данных с помощью fwrite, а затем использую fread, чтобы открыть его, столбец subject становится символом, а уровни упорядочены в алфавитном порядке.

# save the data
fwrite(dat,
       file = "dat.csv",
       sep = "\t")

# read data
dat2 <- fread("dat.csv")

# check structure 
str(dat2)

Classes ‘data.table’ and 'data.frame':  7 obs. of  2 variables:
 $ name   : chr  "Joe" "Bob" "Steve" "Lucy" ...
 $ subject: chr  "ICT" "Math" "Biology" "Sport" ...
 - attr(*, ".internal.selfref")=<externalptr> 

# check order of the levels in subject
as.ordered(dat2$subject)

Levels: Biology < ICT < Math < Sport

Ситуация сохраняется, когда я использую аргумент colClasses и объявляю столбец subject в качестве фактора.

Вопрос Почему функция fread (или fwrite) в data.table не сохраняет столбец темы в качестве фактора. И когда это контролируется для использования аргумента colClasses для указания столбца subject в качестве фактора, почему иерархический порядок уровней в столбце subject не сохраняется?


person Mohamed Yusuf    schedule 01.10.2020    source источник
comment
Это ожидаемое поведение, так как вы сохранили столбец факторов в виде строк символов. Когда вы читаете это снова, fread или другие функции импорта данных не имеют представления об исходных уровнях фактора. Если вы хотите сохранить атрибуты данных, рассмотрите возможность сохранения их в виде файла .RDS.   -  person mt1022    schedule 01.10.2020
comment
или используйте csvy, csv с заголовком метаданных yaml   -  person jangorecki    schedule 09.10.2020


Ответы (1)


Как сказал @ mt1022:

Это ожидаемое поведение, поскольку вы сохранили столбец факторов в виде строк символов. Когда вы читаете это снова, fread или другие функции импорта данных не имеют представления об исходных уровнях фактора. Если вы хотите сохранить атрибуты данных, рассмотрите возможность сохранения их в виде файла .RDS.

person Community    schedule 01.10.2020
comment
Это не правильно. read.csv упорядочит уровни факторов в алфавитном порядке. Посмотрите разницу в выводе между df$subject и df2$subject. - person Jaap; 01.10.2020
comment
Кроме того, начиная с версии R 4.0.0 значение параметра stringsAsFactors по умолчанию равно FALSE; следовательно, read.csv должен давать столбцы символов вместо столбцов факторов. - person Jaap; 01.10.2020
comment
@Jaap Моя ошибка, ты абсолютно прав. Я должен решить проблему в ближайшее время - person David; 01.10.2020
comment
Более того, пакеты rstudioapi и rlist не имеют отношения к этому ответу. - person Jaap; 01.10.2020
comment
imo, вы не сможете исправить это, если не скопируете и не вставите комментарий @mt1022 - person Jaap; 01.10.2020
comment
@Jaap Я не уверен, что понимаю, вы можете отредактировать вопрос, если хотите. может быть яснее - person David; 01.10.2020
comment
Вы заявляете, что вы можете использовать функцию write.csv/read.csv, где они будут выводить столбцы факторов как факторы, и когда вы снова загрузите их, он сохранит порядок, что совершенно неверно . Пожалуйста, обратите внимание на разницу между порядком уровней df$subject и df2$subject. - person Jaap; 01.10.2020
comment
Я предлагаю отредактировать ответ, скопировать комментарий mt1022 и преобразовать его в вики-ответ. - person zx8754; 01.10.2020
comment
@ zx8754 zx8754 Я не знаю, как именно это сделать, можете ли вы уточнить? - person David; 01.10.2020
comment
@DavidS нажмите «Изменить», затем установите флажок, чтобы сделать ответ вики. - person zx8754; 01.10.2020
comment
@Jaap Я отредактировал проблему, можете ли вы ее подтвердить. не хочу запутать читателей - person David; 01.10.2020
comment
@ zx8754 Я сделал это, я думаю - person David; 01.10.2020