我使用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")这就是我现在得到的。我正在寻找一种方法来获得与上面相同的数字:
GEOID
6.02E+13
6.02E+13
6.02E+13
6.02E+13
6.02E+13
6.02E+13发布于 2017-08-30 11:58:51
我建议对这些列进行编码以键入int,因为如果是这样的话,write_*将不再使用科学数字编码。要一次转换所有数字列(例如,在处理计数矩阵的情况下),您可以这样做:
require(dplyr)
tbl_df = mutate_if(tbl_df, is.numeric, as.integer)发布于 2017-10-22 08:46:43
我编写了一个带有补丁的拉请求,以改进对write_csv中科学符号的控制。
使用此修补程序,您将在int_use_scientific=FALSE中使用write_csv参数来解决您的问题。希望它最终能被合并。
发布于 2015-05-20 06:10:26
使用字符值可能更安全:
X <- tbl_df(data.frame(GEOID = as.character(seq(from=60150001022000, to=60150001022005))))
write_csv(X, "test.csv")具有讽刺意味的是,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"作为一个最佳实践,我不同意您的选择,坚持ID变量仍然是数字的。对于对象来说,有太多的暴力可以应用到存储模式中。您不需要对ID变量进行任何算术操作。
https://stackoverflow.com/questions/30341140
复制相似问题