0

当使用 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,我仍然会失去精度。没关系。我可以忍受这一点。

4

3 回答 3

6

试试这个

write.zoo(round(blah, 3), sep = ",")
## "Index","FooHeader","BarHeader"
## "Dec 1985",1.591,NA
## "Dec 1986",NA,21.591
于 2012-11-02T16:04:23.253 回答
2

? write.table指出:

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

不幸的是,需要进行一些整理才能将其返回到format对象:matrixzoo

write.zoo(`index<-`(zoo(format(blah,digits=4)),index(blah)))
"Index" "FooHeader" "BarHeader"
"Dec 1985" " 1.591" "    NA"
"Dec 1986" "    NA" "21.591"
于 2012-11-02T14:53:46.927 回答
2

我会使用coredata<-andround将数值强制为正确的精度,因为您希望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"
于 2012-11-02T15:19:47.340 回答