2012-11-02 17 views
0

使用write.zoo()將一個動物園對象寫入一個CSV文件時,實際上我想將十進制精度從缺省值14降低到3.但是,即使在options()中設置了scipen &數字,I一直未能降低輸出精度。如何在使用R將動物園對象寫入csv文件時刪除小數精度?

下面是示例代碼來說明問題。

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,我仍然會失去精度。沒關係。我可以忍受這一點。

回答

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" 
+0

謝謝了。這很棒!它幫助我擺脫了尾隨的科學符號! 此外,我不需要as.character。索引來自動物園對象,並且Coredata實際上不包括索引列。但很高興知道as.character – Antony

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" 
+0

+1 - 和'write.table()'是由'write.zoo稱爲()'... –

+0

謝謝詹姆斯。這是一個好的開始,但還有兩個問題出現。 1.格式似乎將所有內容都變成了一個字符串,但情況並非如此。即使有修剪選項,我仍然看到數字周圍的雙引號。 2.在具有格式的實際數據集中,我最終得到帶有科學記號的數字,即「1.591e + 01」。我還沒有想出如何擺脫e + 01。 drop0trailing也不能解決問題。 – Antony

+0

@Antony,只需添加'quote = FALSE'。 'write.zoo('index <-'(zoo(格式(blah,digits = 4)),index(blah)),quote = FALSE)' – GSee

4

試試這個

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

這個答案需要上升到頂部。如果有人不知道,G.格羅騰迪克是動物園方法的手下。 (我把它當作字符的原因是爲了得到所需的報價。) –

+0

迪文,我會牢記這一點。謝謝 – Antony