2015-05-20 19 views
10

Tôi đang sử dụng R để xử lý dữ liệu Điều tra dân số sử dụng GEOID số thực sự dài để xác định các khu vực địa lý. Vấn đề tôi đang gặp phải là khi viết ra dữ liệu đã xử lý bằng cách sử dụng write_csv (từ gói readr), nó đang viết các GEOID này theo ký hiệu khoa học. Có cách nào để giải quyết vấn đề này không?readr: Tắt ký hiệu khoa học trong write_csv

Lưu ý: Tôi có thể chuyển đổi hiển thị ký hiệu khoa học trên bảng điều khiển R bằng cách đặt tùy chọn scipen thành giá trị đủ lớn. Nhưng cài đặt này dường như không mở rộng vào thư viện readr.

Đây là một tập dữ liệu đồ chơi:

library(dplyr) 
library(readr) # which is the package with write_csv 
(tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))) 
Source: local data frame [6 x 1] 

      GEOID 
1 60150001022000 
2 60150001022001 
3 60150001022002 
4 60150001022003 
5 60150001022004 
6 60150001022005 

write_csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv") 

Đây là những gì tôi hiện đang nhận được. Tôi đang tìm kiếm một cách để có được những con số tương tự như trên:

GEOID 
6.02E+13 
6.02E+13 
6.02E+13 
6.02E+13 
6.02E+13 
6.02E+13 
+0

Bạn có thể chuẩn bị một [ví dụ tái sản xuất nhỏ] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) để minh họa sự cố không? Bạn có chắc chắn muốn coi những giá trị đó là giá trị số không? Có lẽ chuyển đổi chúng thành giá trị ký tự/yếu tố? – MrFlick

+0

Tôi muốn tiếp tục sử dụng loại số. Nó sẽ là tốt để biết làm thế nào để ngăn chặn các ký hiệu khoa học cho các tập tin viết. – sriramn

Trả lời

1

tôi sẽ đề nghị bạn sử dụng

write.csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv") 

thay vì

write_csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv") 

Nếu tôi mở test.csv nó mở tệp trong Excel. Excel biến nó thành ký hiệu khoa học. Khi tôi nhấp chuột phải và mở bằng notepad có vẻ tốt và tôi thấy các số gốc mà không có ký pháp khoa học.

+0

Cảm ơn! Tôi đang cố gắng chuyển sang gói 'readr' và đang tìm cách xem tôi có thể làm như thế nào trong thư viện đó. – sriramn

3

Nó có lẽ sẽ an toàn hơn để sử dụng các giá trị nhân vật:

X <- tbl_df(data.frame(GEOID = as.character(seq(from=60150001022000, to=60150001022005)))) 

write_csv(X, "test.csv") 

Đó là một chút mỉa mai rằng chức năng write_csv không ép buộc một số sản lượng của nó với các giá trị nhân vật, nhưng không cột số. Chỉ khi một cột vượt qua bài kiểm tra is.object thì cột đó sẽ bị ép buộc. Có vẻ như không phải là một công tắc để ném mà sẽ duy trì độ chính xác tối đa. Các write.table và con của nó write.csv chức năng có một số thiết bị chuyển mạch cho phép đàn áp báo giá và các thiết lập khác cho phép may đầu ra nhưng write_csv có rất ít như vậy.

Bạn có thể lừa write_csv nghĩ rằng một cột số là một cái gì đó phức tạp hơn và điều này dẫn đến kết quả đầu ra as.character, mặc dù có dấu ngoặc kép.

class(X[[1]])<- c("num", "numeric") 
vapply(X, is.object, logical(1)) 
#GEOID 
# TRUE 

write_csv(X, "") 
#[1] #"\"GEOID\"\n\"60150001022000\"\n\"60150001022001\"\n\"60150001022002\"\n\"60150001022003\"\n\"60150001022004\"\n\"60150001022005\"\n" 

Như một vấn đề của thực tiễn tốt nhất mà tôi không đồng ý với sự lựa chọn của bạn của nhấn mạnh rằng ID-biến vẫn số. Có quá nhiều bạo lực có thể được áp dụng cho chế độ lưu trữ đó cho một đối tượng. Bạn không cần bất kỳ phép toán số học nào cho một biến ID.

+0

Cảm ơn. Nhưng tôi đã tự hỏi nếu có một cách để tắt hành vi cho loại số? – sriramn

1

Sử dụng bit64, nó là một lớp S3 cho vectơ cho số nguyên 64bit

library(dplyr) 
library(readr) 
options(digits = 22) 
tbl_df <- data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)) 
> tbl_df 
      GEOID 
1 60150001022000 
2 60150001022001 
3 60150001022002 
4 60150001022003 
5 60150001022004 
6 60150001022005 

library(bit64) 
tbl_df$GEOID <- as.integer64(tbl_df$GEOID) 
write_csv(tbl_df,'test.csv') 

Nếu bạn đọc dữ liệu này một lần nữa trong R, nó sẽ gán các kiểu dữ liệu chính xác.

dfr <- read_csv('test.csv') 
> dfr 
Source: local data frame [6 x 1] 

      GEOID 
1 60150001022000 
2 60150001022001 
3 60150001022002 
4 60150001022003 
5 60150001022004 
6 60150001022005 

> str(tbl_df) 
'data.frame': 6 obs. of 1 variable: 
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 6 obs. of 1 variable: 
$ GEOID: num 6.02e+13 6.02e+13 6.02e+13 6.02e+13 6.02e+13 ... 

Hy vọng điều này sẽ hữu ích. Tôi đã mở csv trong một trình soạn thảo văn bản, những con số có "" xung quanh chúng. Nhưng nó vẫn hoạt động.

3

Tôi muốn đề xuất ghi lại các cột như vậy để nhập int, bởi vì nếu như vậy write_* sẽ không sử dụng mã hóa số khoa học nữa.Để chuyển đổi tất cả các cột số trong một đường chuyền (ví dụ trong trường hợp bạn đang làm việc với một ma trận đếm), bạn có thể làm:

require(dplyr)  
tbl_df = mutate_if(tbl_df, is.numeric, as.integer) 
4

Tôi đã viết một pull request với một bản vá để cải thiện sự kiểm soát của ký hiệu khoa học trong write_csv.

Với bản vá này, bạn sẽ có một đối số int_use_scientific=FALSE trong write_csv có thể giải quyết được sự cố của bạn. Hy vọng rằng nó sẽ được sáp nhập cuối cùng.

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