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 с использованием того же кода факторы распознаются как факторы. Это несколько неоптимально.
Какие-либо предложения?
Я использую 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