readr:在write_csv中关闭科学记数法

sri*_*amn 18 csv file-io r

我使用R来处理人口普查数据,该数据使用非常长的数字GEOID来识别地理位置.我面临的问题是,当使用write_csv(从readr包中)写出处理过的数据时,它正在用科学记数法编写这些GEOID.有办法解决这个问题吗?

注意:我可以通过将scipen选项设置为足够大的值来切换R控制台上的科学记数法显示.但是这个设置似乎没有扩展到readr库中.

这是一个玩具数据集:

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")
Run Code Online (Sandbox Code Playgroud)

这就是我目前所获得的.我正在寻找一种方法来获得与上面相同的数字:

GEOID
6.02E+13
6.02E+13
6.02E+13
6.02E+13
6.02E+13
6.02E+13
Run Code Online (Sandbox Code Playgroud)

Hol*_*ndl 12

我宁愿建议重新编码这些列进行输入int,因为如果这样write_*就不再使用科学数字编码了.要在一次传递中转换所有数字列(例如,如果您正在处理计数矩阵),您可以执行以下操作:

require(dplyr)    
tbl_df = mutate_if(tbl_df, is.numeric, as.integer)
Run Code Online (Sandbox Code Playgroud)


zee*_*hio 8

我写了一个带有补丁的拉取请求,以改进对科学记数法的控制write_csv.

有了这个补丁你会有一个int_use_scientific=FALSE参数,write_csv这将解决你的问题.希望它最终会合并.


42-*_*42- 5

使用字符值可能更安全:

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

 write_csv(X, "test.csv")
Run Code Online (Sandbox Code Playgroud)

具有讽刺意味的是,write_csv函数确实将其某些输出强制为字符值,而不是数字列。仅当列通过is.object测试时,它才会被强制。似乎没有抛出开关可以保持最大精度。该write.table和它的后代write.csv功能有几个开关,以便报价和其他设置,允许定制输出,但抑制write_csv已经很少这样。

您可以诱使write_csv认为数字列会更复杂as.character ,尽管会带引号,但确实会导致输出。

 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"
Run Code Online (Sandbox Code Playgroud)

根据最佳做法,我不同意您选择坚持ID变量保持数字形式的选择。太多的暴力可应用于对象的该存储模式。ID变量不需要任何算术运算。