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"
。感谢。
答案 0 :(得分:10)
在3.1.1版中,News file:
中列出了此更改
type.convert()
,read.table()
和类似的read.*()
函数会获得一个新的numerals
参数,指定数字输入在转换为双精度时的转换精度如何。默认numerals = "allow.loss"
允许精度损失,如3.1.0之前的R版本。
有关原始更改的大部分发布后讨论,包括通过其他警告恢复默认行为的决定,都可以找到in a thread on the developers' email list。
对于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已经发布,答案已经更新。
答案 1 :(得分:4)
尝试使用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"
稍后添加由于此答案已发布,因此R 3.1.0的最新修补版本已经发布,默认情况下会使用新的numerals
参数恢复旧行为以指定它不同。请参阅type.convert和read.table
答案 2 :(得分:3)
由于我没有代表对Brian Diggs的回应发表评论 - 为了将来的参考,新的论点现在称为“数字”(不是“精确”)。来自http://cran.r-project.org/bin/windows/base/NEWS.R-3.1.0patched.html:
type.convert(),read.table()和类似的read。*()函数获取一个新的数字参数,指定数字输入在转换为双精度时失去准确性的方式。默认数字=“allow.loss”允许精度损失,如3.1.0之前的R版本。