Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Mohamed YusufОтветов: 1

Когда я пытаюсь прочитать ранее сохраненный 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 не сохраняется?

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

rfreadfwrite

Ответы

Ответ 1 · рейтинг 1 · Community

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы