2012-05-22 30 views
10

Tôi đang cố gắng đọc tệp csv có mã vạch trong cột đầu tiên, nhưng khi R chuyển thành mã data.frame, nó chuyển đổi “1665535004661” thành “1,67E + 12”. Có cách nào để bảo toàn số này ở định dạng số nguyên không? Tôi đã thử chỉ định một lớp “gấp đôi”, nhưng điều đó không hiệu quả, cũng như không chỉ định một lớp “nhân vật”. Khi nó ở định dạng 1.67E + 12, bất kỳ nỗ lực nào để chuyển đổi nó trở về một số nguyên đều trả về “167000000000”.Bảo quản số lớn

Cảm ơn, J--

Trả lời

12

Nó không phải trong một "định dạng 1.67E + 12", nó chỉ sẽ không in hoàn toàn bằng cách sử dụng giá trị mặc định. R đang đọc nó tốt và toàn bộ số đó ở đó.

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

Hãy xem, các con số đã có sẵn. Họ không bị lạc trừ khi bạn có số lượng chữ số thực sự lớn. Sắp xếp trên những gì bạn đưa vào sẽ hoạt động tốt và bạn chỉ có thể gọi rõ ràng print() với tùy chọn chữ số để xem data.frame của bạn thay vì ngầm bằng cách gõ tên.

+0

Điều này chủ yếu ghi đè phương pháp mà tôi thảo luận bên dưới với 'options()'. Như một điểm tham chiếu, người ta nên đọc và lưu ý cảnh báo trong '? Print.default' khi việc triển khai tại> = 16 chữ số bắt đầu trở thành một vấn đề nền tảng cụ thể khi việc thực thi' sprintf() 'bắt đầu khác nhau dựa trên mã C cơ bản. – Chase

+0

Điều này cũng đúng nếu bạn sử dụng tùy chọn(). Nó chỉ là một mặc định đầu ra. Tôi nghĩ rằng nó sẽ là tốt nhất nếu bạn đã rõ ràng về điều đó trong câu trả lời của bạn. Vì nó là khá mơ hồ. Cố gắng đọc nó ngây thơ Tôi tự hỏi nếu các chữ số tùy chọn chỉ thay đổi bao nhiêu chữ số được giữ lại, làm thế nào họ đang đọc trong? ... những gì? – John

+0

Điểm tốt - đã chỉnh sửa câu trả lời của tôi để rõ ràng hơn về điều đó. Vui lòng tinh chỉnh thêm nếu bạn nghĩ cần thiết. Chúc mừng! - Chase – Chase

3

Hãy nhìn vào gói int64: Bringing 64-bit data to R.

+0

Có cách nào để nhập nó dưới dạng ký tự không? Tôi không cần phải làm toán với nó, tôi chỉ cần phân loại nó. – James

+0

x <- "1665535004661" –

10

Chọn những gì bạn đã nói trong nhận xét, bạn có thể nhập trực tiếp văn bản dưới dạng ký tự bằng cách chỉ định colClasses trong read.table(). Ví dụ:

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 

Ngoài ra (và cho các mục đích khác), bạn có thể chỉ định các biến digits dưới options(). Mặc định là 7 chữ số và phạm vi chấp nhận được là 1-22. Để được rõ ràng, thiết lập tùy chọn này không có cách nào thay đổi hoặc làm thay đổi dữ liệu cơ bản, nó chỉ kiểm soát cách nó được hiển thị trên màn hình khi in. Từ trang trợ giúp cho ?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. 

Ví dụ minh họa này:

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

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

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

Để xác thịt này ra hoàn toàn và để giải thích cho các trường hợp khi thiết lập một khung cảnh toàn cầu là không thích hợp, bạn có thể chỉ định số trực tiếp làm đối số cho print(foo, digits = bar). Bạn có thể đọc thêm về điều này dưới ?print.default. Đây là những gì John mô tả trong câu trả lời của mình để tín dụng nên đến với anh ta để chiếu sáng sắc thái đó.

4

Từ trang is.integer:

"Lưu ý rằng việc triển khai hiện tại của R sử dụng số nguyên 32-bit cho vectơ số nguyên, do đó hàng loạt các số nguyên biểu diễn bị hạn chế xuống còn khoảng +/- 2 * 10^9 ?

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

Bạn muốn gói Rmpfr.

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

Vì bạn không thực hiện số học về giá trị này, ký tự là phù hợp. Bạn có thể sử dụng đối số colClasses để thiết lập các lớp khác nhau cho mỗi cột, có lẽ tốt hơn là sử dụng tất cả các ký tự.

dữ liệu.csv:

a,b,c 
1001002003003004,2,3 

đọc nhân vật, sau đó số nguyên:

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

Bạn có thể sử dụng các đối số bằng số khi bạn đang thực hiện read.csv. Vì vậy, ví dụ:

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

Điều này bảo tồn giá trị của số nguyên dài và không gây rối khi trình bày dữ liệu.

Các vấn đề liên quan