сохранить старый (до 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 15

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.