2014-02-13 67 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