2014-02-13 68 views
-1

我使用fread()data.table高效读取大型矩形CSV文件导入R这些都是double(只有double)值 - 不缺少的元素。FREAD无法读取小的数字

但是,如果我在科学记数法中有非常非常小的数字,它将转换为废弃整个阅读的字符。以下是错误消息(作为一个例子,有多个用于每个小数目):

16:在的fread(“SomeCSVFile”):
撞柱560上的数据行16799键入字符,字段包含'-2.1412168512924677E-308'。强制先前将此列中的值从整数或数字读回到可能不会丢失的字符;例如,如果'00'和'000'在它们现在仅为'0'之前发生,并且可能与',,'和',NA'的处理不一致(如果它们在碰撞前发生在该列之前)。如果这个问题请重新运行并为此专栏设置“colClasses”为“字符”。请注意,列类型检测使用前5行,中间5行和最后5行,所以希望此消息应该非常少见。如果要报告给datatable-help,请重新运行并包含来自verbose = TRUE的输出。

我想要函数将它们设置为零或截断它们的最小可能值(或罚款)。

+1

这个问题可以通过提供一些重现问题的示例数据大大改善。 –

+1

真正的问题是什么?你对这些小值有什么实际用途?谁允许Excel表格首先生成它们?如果你打算将它们设置为零,只需读入它们,然后'matrix [is.character(matrix)] < - numeric(0)' –

+0

@CarlWitthoft我不使用Excel,但感谢解决方案。 – user2763361

回答

5

要重现此,我把这个内容在文本文件:

x 
1 
1 
1 
1 
1 
1e-309 

然后我打电话fread("that file.txt")


是R可以存储的最小正数的大小是

format(.Machine$double.xmin, digits = 22) 
## [1] "2.2250738585072013828e-308" 

你的数据文件包括值-2.1412168512924677E-308,其比这个限制小。为防止R将值视为零,data.table包已将列转换为字符串。这阻止了数据精确度的丢失。

如果您需要使用此大小的值,请使用Rmpfr包以更精确的方式存储数字。将它们导入为字符(使用colClasses;请参阅数据表警告文本)。然后使用

library(Rmpfr) 
mpfr("-2.1412168512924677E-308") 
## 1 'mpfr' number of precision 70 bits 
## [1] -2.1412168512924676999992e-308 

正如评论奔Bolker西亚德。如果您不关心小数字,只想将它们视为零,则将该列导入为字符,然后使用as.numeric

the_data <- fread("the file.txt", colClasses = "character") 
the_data$DodgyColumn <- as.numeric(the_data$DodgyColumn) 
+0

但这意味着我不能如果我的矩阵不是统一的数字,甚至可以使用'fread'。我如何从实际的角度解决这个问题,知道'-2.14 ... E-308'和'-2.225..E-308'之间的区别对我来说并不是什么东西(即让它向下舍入为零或某事合理)。 – user2763361

+1

你可以使用'fread';你只需要指定colClasses参数。重新阅读该警告文字。 –

+0

您是否真的转载了OP的问题(如果是这样,您能否为您的答案添加可重复的示例)?他们描述的内容不会发生在我身上 - 小数字读为0. – eddi