我使用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)
使用字符值可能更安全:
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变量不需要任何算术运算。