【问题标题】:How to drop decimal precision when writing a zoo object to csv file with R?使用R将动物园对象写入csv文件时如何降低小数精度?
【发布时间】:2012-11-02 14:43:40
【问题描述】:

当使用 write.zoo() 将 zoo 对象写入 CSV 文件时,我实际上希望将小数精度从默认的 14 降低到仅 3。但是,即使在 options() 中设置了 scipen 和数字,我无法降低输出的精度。

这里有一个示例代码来说明问题。

blah <- zoo(cbind(c(1.590833333333335, NA), c(NA, 21.590833333333337)))
index(blah) <- c("Dec 1985", "Dec 1986")
colnames(blah) <- c("FooHeader", "BarHeader")
options(scipen = 3, digits = 3)
write.zoo(blah, file = "blah.csv", sep = ",")

如果我打开 blah.csv 文件,我会看到

"Index","FooHeader","BarHeader"
"Dec 1985",1.59083333333334,NA
"Dec 1986",NA,21.5908333333333

但我真正想看到的是

"Index","FooHeader","BarHeader"
"Dec 1985",1.591,NA
"Dec 1986",NA,21.591

我该如何实现呢?提前致谢!

注意:我知道通过降低精度,如果我再次将数据读入 R,我仍然会失去精度。没关系。我可以忍受。

【问题讨论】:

    标签: r csv zoo


    【解决方案1】:

    试试这个

    write.zoo(round(blah, 3), sep = ",")
    ## "Index","FooHeader","BarHeader"
    ## "Dec 1985",1.591,NA
    ## "Dec 1986",NA,21.591
    

    【讨论】:

    • 这个答案需要上升到顶部。万一有人不知道,G. Grothendieck 无疑是动物园方法的大师。 (我放 as.character 的原因是为了得到请求的引号。)
    【解决方案2】:

    我会使用 coredata&lt;-round 将数值强制为正确的精度,因为您希望引用它们,之后使用 as.character

     coredata(blah) <- as.character(round(coredata(blah), 3))
     write.zoo(blah, file="testzoo.csv", sep= ",")
    #----file------
    "Index","FooHeader","BarHeader"
    "Dec 1985","1.591",NA
    "Dec 1986",NA,"21.591"
    

    【讨论】:

    • 非常感谢。这很棒!它也可以帮助我摆脱尾随的科学记数法!另外,我不需要 as.character。索引来自 zoo 对象,coredata 确实不包含索引列。但是很高兴了解 as.character
    【解决方案3】:

    ?write.table 声明:

    在几乎所有情况下,数字量的转换都受到控制 通过选项“scipen”(参见options),但使用内部等效项 的digits=15。为了更好地控制,使用format 来制作一个角色 矩阵/数据框,然后调用write.table

    不幸的是,format 输出了 matrix,因此需要进行一些整理才能将其返回到 zoo 对象:

    write.zoo(`index<-`(zoo(format(blah,digits=4)),index(blah)))
    "Index" "FooHeader" "BarHeader"
    "Dec 1985" " 1.591" "    NA"
    "Dec 1986" "    NA" "21.591"
    

    【讨论】:

    • 谢谢詹姆斯。这是一个好的开始,但出现了两个额外的问题。 1. 格式好像把所有东西都变成了字符串,其实不应该的。即使使用修剪选项,我仍然会看到数字周围的双引号。 2. 在实际的数据集中,用格式,我最终得到带有科学计数法的数字,即“1.591e+01”。我还没有弄清楚如何摆脱e + 01。 drop0trailing 也不能解决问题。
    • @Antony,只需添加quote=FALSEwrite.zoo(index(zoo(format(blah,digits=4)),index(blah)), quote=FALSE)
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多