2010-10-20 62 views
20

1E-5,而不是我用read.table读取包含数字,如0.00001数字格式,书写0.00001

一个文件时,我写他们回来write.table这些数字显示为1E-5

我怎样才能保持旧的格式?

回答

15

您可以通过格式转换你的号码为字符串根据您的需要,然后使用参数quote = FALSE在调用write.table做到这一点。

dfr <- data.frame(x = 10^(0:15)) 
dfr$y <- format(dfr$x, scientific = FALSE) 
write.table(dfr, file = "test.txt", quote = FALSE) 

请注意,您不应该更改文件中数字的格式。几乎每一件科学软件和每个电子表格都可以理解数字的科学记号,并且还具有数字格式选项,因此您可以查看它们的选择方式。

+1

格式化的文本文件,我也许应该提到的是使用'报价= FALSE'将停止所有** **字符和因子列被引用。 – 2010-10-20 17:08:48

+2

我将csv文件传递给postgres数据库。默认的sql不会将1e + 5识别为整数... – Rodrigo 2015-09-03 18:05:09

+0

例如Circos(http://circos.ca/)需要非科学格式。因此,我猜想,Perl不会将科学数字视为整数。 – 2016-07-19 10:24:16

5

如果输入是科学记数法和显式记数法的混合,那么您将编写自己的解析器来读取数字并记录哪些是哪种格式。事实上,你会想要保留这些数字的字符串表示,因此你可以写回,正好是输入内容。

但是,如果您只是想以一致的显式表示法编写write.table(),请尝试。

 
    write.table(format(_your_table_here_, scientific=FALSE), ...) 
34

我只会在拨打write.table之前更改scipen选项。请注意,这也会改变打印到控制台时数字的显示方式。

options(scipen=10) 
write.table(foo, "foo.txt") 
options(scipen=0) # restore the default 
+0

如果我只需要一行,而且我有几个? – skan 2010-10-20 14:31:39

+5

@ user425895:然后你需要在你的问题中指定。 – 2010-10-20 14:39:06

+1

现代变体:'withr :: with_options(c(scipen = 10),write.table(foo,“foo.txt”)'。 – 2016-07-19 13:42:30

1

对于所有行的最大控制环和它们打印与的sprintf

# Find number of rows in data.frame test 
nrows <- dim(test)[1] 

# init a new vector 
mylines <- vector("character",dim(test)[1]) 

# loop over all rows in dataframe 
for(i in 1:nrows){ 
    # Print out exactly the format you want 
    mylines[i] <- sprintf("Line %d: %.2f\t%.2f",1,test[i,"x"],test[i,"y") 
} 

# write lines to file 
writeLines(mylines,"out.txt")