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