read.csv, похоже, не обнаруживает факторы в R 4.0.0

Я недавно обновился до R 4.0.0 с R 3.5.1. Поведениеread.csvпохоже, изменилось - когда я загружаю файлы.csv в R 4.0.0, факторы не определяются автоматически, а распознаются как символы. Я все еще использую версию 3.5.1 на моем компьютере, и при загрузке тех же файлов в 3.5.1 с использованием того же кода факторы распознаются как факторы. Это несколько неоптимально.

Какие-либо предложения?

Скриншот R3.5.1Скриншот R4.0.0

Я использую Windows 10 Pro и создаю файлы.csv в Excel 2013.

2 ответа

Как сказал Ронак Шах в комментарии к вашему заданию, R 4.0.0 изменил поведение по умолчанию в том, как read.table() (и его обертки, включая read.csv()) обрабатывает символьные векторы. По этому поводу велись долгие дебаты, но в основномstringsAsFactors == Tнастройка была по умолчанию с момента появления R, потому что это помогло сэкономить память из-за того, как факторные переменные реализованы в R (по сути, они представляют собой целочисленный вектор с добавленной сверху информацией уровня фактора). В настоящее время причин для этого меньше, поскольку памяти намного больше, и этот вариант часто вызывает непредвиденные побочные эффекты.

Вы можете узнать больше о вашей конкретной проблеме, а также о других особенностях векторов в R в главе 3 Advanced R Хэдли Уикхема. Там он приводит две статьи, в которых подробно рассказывается, почему поведение по умолчанию было таким, каким оно было. Вот одно, а вот другое. Я также предлагаю вам ознакомиться с книгой Хэдли, если у вас уже есть некоторый опыт работы с R, она очень помогла мне изучить некоторые из менее очевидных особенностей языка.

Как все здесь сказали - поведение по умолчанию изменилось в R 4.0.0, и строки больше не преобразуются автоматически в факторы. Это влияет на различные функции, в том числеread.csv() а также data.frame(). Однако некоторые функции, которые явно предназначены для работы с факторами, не затрагиваются. Это включаетexpand.grid() а также as.data.frame.table().

Один из способов обойти это изменение - установить глобальный параметр:

options(stringsAsFactors = TRUE)

Но это также будет устаревшим, и в конечном итоге вам придется вручную преобразовывать строки в коэффициенты.

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

Вы можете прочитать об этом на "The R Blog" stringsAsFactors сообщение от Курта Hornik

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