使用R将动物园对象写入csv文件时如何删除小数精度?

时间:2012-11-02 14:43:41

标签: r csv zoo

当使用write.zoo()将一个zoo对象写入CSV文件时,我实际上想将十进制精度从默认值14下降到只有3.但是,即使设置了scipen& options()中的数字,我无法降低输出的精度。

以下是说明问题的示例代码。

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

3 个答案:

答案 0 :(得分:4)

试试这个

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

答案 1 :(得分:2)

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"

答案 2 :(得分:2)

我会使用coredata<-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"