保留旧的(3.1.0之前的)type.convert行为

时间:2014-04-15 01:10:42

标签: r read.table

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 个答案:

答案 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.convertread.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版本。