2012-05-22 41 views
10

我想讀取第一列中有條形碼的csv文件,但是當R獲取到data.frame中時,它會將「1665535004661」轉換爲「1.67E + 12」。有沒有辦法以整數格式保存這個數字?我試着分配一個「雙」類,但那不起作用,也沒有分配一個「字符」類。一旦它處於1.67E + 12格式,任何將其轉換回整數的嘗試都會返回「167000000000」。保留大數

感謝, J--

回答

12

這不是在 「1.67E + 12格式」,它只是將不會完全使用默認設置打印。 R正在讀取它,並且整個數字都在那裏。

x <- 1665535004661 
> x 
[1] 1.665535e+12 
> print(x, digits = 16) 
[1] 1665535004661 

看,數字一直存在。除非你有非常多的數字,否則他們不會迷路。根據您所帶入的內容進行排序可以正常工作,您只需使用digits選項顯式調用print()即可通過鍵入名稱來隱式查看data.frame。

+0

這基本上覆蓋我在下面討論的方法用'選項()'。作爲一個參考點,當'= print.default'中的實現開始成爲特定於平臺的問題時,應該閱讀並注意'?print.default'中的警告,因爲sprintf()的實現開始根據底層的C代碼。 – Chase

+0

如果使用options(),情況也是如此。這只是一個輸出默認值。我認爲如果你在答案中明確了這一點,那將是最好的。因爲這是相當模糊的。試圖閱讀它天真,我想知道如果數字選項只是改變了多少數字保留,他們是如何閱讀?...什麼? – John

+0

好點 - 編輯我的答案是更明確的。如果您認爲有必要,隨意調整。乾杯! - 追逐 – Chase

3

看看在int64包:Bringing 64-bit data to R

+0

有沒有辦法,只是導入它作爲一個人物?我不需要用它做數學,我只需要對它進行排序。 – James

+0

X < - 「1665535004661」 –

10

通過在評論中提到的內容,可以通過在read.table()中指定colClasses來直接將文本導入爲字符。例如:

num <- "1665535004661" 
dat.char <- read.table(text = num, colClasses="character") 
str(dat.char) 
#------ 
'data.frame': 1 obs. of 1 variable: 
$ V1: chr "1665535004661" 
dat.char 
#------ 
      V1 
1 1665535004661 

備選地(和其它用途),可以options()下指定digits變量。默認值是7位數字,可接受的範圍是1-22。要清楚,設置此選項絕不會更改或更改基礎數據,它只是控制打印時它在屏幕上的顯示方式。從幫助頁面?options

controls the number of digits to print when printing numeric values. It is a suggestion only. 
Valid values are 1...22 with default 7. See the note in print.default about values greater than 
15. 

舉例說明這一點:

options(digits = 7) 
dat<- read.table(text = num) 

dat 
#------ 
      V1 
1 1.665535e+12 

options(digits = 22) 
dat 
#------ 
      V1 
1 1665535004661 

要設置全局設置時完全充實了這一點,考慮到案件是不可取的,您可以直接指定位數作爲參數print(foo, digits = bar)。您可以在?print.default下閱讀更多關於此的內容。這就是約翰在他的回答中所描述的,所以應該給他留下信息來說明這個細微差別。

4

從is.integer頁:

「注意的R,當前的實現方式中使用的整數向量的32位整數,因此可表示整數的範圍被限制到約+/- 2 * 10^9 ?

1665535004661L> 2 * 10^9 [1] TRUE

你要打包Rmpfr。

library(Rmpfr) 
x <- mpfr(15, precBits= 1024) 
2

由於您未對此值執行算術運算,因此字符是適當的。您可以使用colClasses參數爲每列設置不同的類,這可能比使用所有字符更好。

數據。CSV:

a,b,c 
1001002003003004,2,3 

讀取字符,然後整數:

x <- read.csv('test.csv',colClasses=c('character','integer','integer')) 
x 
       a b c 
1 1001002003003004 2 3 


mode(x$a) 
[1] "character" 

mode(x$b) 
[1] "numeric" 
1

當你正在做 read.csv您可以使用數字參數。例如:

read.csv(x, sep = ";", numerals = c("no.loss")) Where x is your data. 

這將保留長整數的值,並且在導入數據時不會混淆它們的表示形式。