Сохранить старый (pre 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"
в приведенном выше примере. Спасибо.
Ответы
Ответ 1
В версии 3.1.1 это изменение указано в News file:
type.convert()
, read.table()
и аналогичные функции read.*()
получают новый аргумент numerals
, определяющий способ преобразования числового ввода, когда его преобразование в двойную точность теряет точность. По умолчанию numerals = "allow.loss"
допускает потерю точности, как в версиях R до 3.1.0.
Значительная часть обсуждения после релиза об исходном изменении, включая решения о возврате поведения по умолчанию с дополнительным предупреждением, можно найти в потоке на список рассылки разработчиков.
Для версии 3.1.0 код нужно будет изменить, чтобы получить старое поведение. Переход на 3.1.1 - это еще одна стратегия.
Упоминание об этом изменении для версии 3.1.0 (из того же News file) говорит
type.convert()
(и, следовательно, по умолчанию read.table()
) возвращает вектор символов или коэффициент, представляющий числовой ввод, поскольку двойной может потерять точность. Аналогично для сложных входов.
Если файл содержит числовые данные с непредсказуемыми числами десятичных знаков, которые предназначены для чтения как числовые, укажите colClasses
в read.table()
как "numeric"
.
Примечание: исходный ответ был написан, когда соответствующая версия с исправлением была исправлена 3.1.0. Теперь ответ был обновлен, когда был выпущен 3.1.1.
Ответ 2
Попробуйте использовать data.table 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"
ADDED LATER. Поскольку этот ответ был опубликован, последняя исправленная версия R 3.1.0 появилась и по умолчанию возвращается к старому поведению с новым аргументом numerals
, чтобы указать его по-разному. См. type.convert и read.table
Ответ 3
Поскольку у меня нет комментариев комментировать ответ Брайана Диггса - для будущей ссылки новый аргумент теперь называется "цифры" (а не "точным" ). Из http://cran.r-project.org/bin/windows/base/NEWS.R-3.1.0patched.html:
type.convert(), read.table() и аналогичные функции read. *() получают новый аргумент цифр, указав, как числовой ввод преобразуется, когда его преобразование в двойную точность теряет точность. Значения по умолчанию = "allow.loss" позволяют потеря точности, как в версиях R до 3.1.0.