сохранить старый (до 3.1.0) тип.поведение преобразования
R 3.1.0 вышел, и одна из новых функций является следующей:
type.convert()
(и, следовательно, по умолчаниюread.table()
) возвращает символьный вектор или фактор, когда представление числового ввода в виде двойника потеряет точность. Аналогично для сложных входных сигналов.
Приведем пример:
df <- read.table(text = "num1 num2
1.1 1.1234567890123456
2.2 2.2
3.3 3.3", header = TRUE)
sapply(df, class)
# num1 num2
# "numeric" "factor"
В то время как в предыдущих версиях read.table
возвращал бы два числовых столбца.
Для тех, кто, как я, озабочен этим изменением, что можно сделать, чтобы сохранить старое поведение?
Примечание: Я хотел бы получить общее решение, которое не делает предположений о входных данных, т. е. не предлагает мне использоватьcolClasses = "numeric"
в приведенном выше примере. Спасибо.3 ответа:
В версии 3.1.1 есть это изменение, перечисленное в файле новостей :
type.convert()
,read.table()
и аналогичные функцииread.*()
получают новый аргументnumerals
, указывающий, как преобразуется числовой ввод, когда его преобразование в двойную точность теряет точность. Значение по умолчаниюnumerals = "allow.loss"
допускает потерю точности, как и в версиях R до версии 3.1.0.Большая часть обсуждения после выпуска об исходном изменении, включая решения об отмене поведения по умолчанию с дополнительным предупреждение, можно найти в потоке в списке электронной почты разработчиков .
Для версии 3.1.0 код должен быть изменен, чтобы получить старое поведение. Переход на 3.1.1 - это еще одна стратегия.
Упоминание об этом изменении для версии 3.1.0 (из того же файла новостей ) говорит
type.convert()
(и, следовательно, по умолчаниюread.table()
) возвращает символьный вектор или фактор, когда представление числового ввода в виде двойника потеряет точность. Аналогично для комплекса входной.Если файл содержит числовые данные с непредставимыми числами десятичных разрядов, которые должны быть прочитаны как числовые, укажите
colClasses
вread.table()
Как"numeric"
.Примечание: оригинальный ответ был написан, когда соответствующая версия с исправлением была исправлена 3.1.0. Ответ был обновлен теперь, когда 3.1.1 была выпущена.
Попробуйте использовать данные.Таблица
fread
:# create test data set "a.dat" Lines <- "num1 num2\n1.1 1.1234567890123456\n2.2 2.2\n3.3 3.3\n" cat(Lines, file = "a.dat") ##### library(data.table) DT <- fread("a.dat") str(DT) ## Classes ‘data.table’ and 'data.frame': 3 obs. of 2 variables: ## $ num1: num 1.1 2.2 3.3 ## $ num2: num 1.12 2.2 3.3 ## - attr(*, ".internal.selfref")=<externalptr> class(DT) ## [1] "data.table" "data.frame" DF <- as.data.frame(DT) class(DF) ## [1] "data.frame"
Добавлено позже поскольку этот ответ был опубликован, вышла последняя исправленная версия R 3.1.0 и по умолчанию возвращается к старому поведению с новым аргументом
numerals
, чтобы указать его по-другому. См.тип .преобразовать и читать.таблица
Поскольку у меня нет представителя, чтобы прокомментировать ответ Брайана Диггса-для дальнейшего использования, новый аргумент теперь называется " цифры "(не"точные"). От http://cran.r-project.org/bin/windows/base/NEWS.R-3.1.0patched.html :
Тип.convert (), читать.таблица() и аналогичное чтение.* () функции получают новый аргумент numerals, указывающий, как преобразуется числовой ввод, когда его преобразование в двойную точность теряет точность. Цифры по умолчанию = " разрешить.потеря " допускает потерю точности, как и в версиях R до версии 3.1.0.