【问题标题】:How to format output with write.table如何使用 write.table 格式化输出
【发布时间】:2016-03-15 03:03:03
【问题描述】:

如果这是一个简单的问题,我深表歉意。我正在尝试使用 R 中 MixSim 包中的点作为旧 Fortran 程序中的采样点,因为我喜欢 MixSim 更好地创建采样点的方式,但我正在使用 Fortran 程序来模拟多个级别的植被数据beta 多样性、alpha 多样性等。

我在 MixSim 中通过以下方式生成数据:

d=MixSim(BarOmega=0.000,MaxOmega=0.000,K=4,p=3,ecc=0.99,int=c(10,90),PiLow=0.1)
m=simdataset(n=10,Pi=d$Pi,Mu=d$Mu,S=d$S)

如果我确实使用 write.table,这就是我得到的

write.table(m$X,file="example.txt",quote=F,row.names=F)
V1 V2 V3
87.540626647788 62.8444539443256 17.0026406651813
83.9939847940881 65.0069747775257 18.8676229149976
84.4477456535804 63.6892673685408 18.6384437248469
84.7684968694547 65.4610993744652 17.6252989584773
13.4600970937604 16.9988156469822 49.6810813619893
23.9952555783055 18.6598302958281 48.4204641715953
17.0523647853253 11.518037157788 43.0417655739052
57.5107395863171 40.4872578216636 24.938188234695
11.8320140526743 52.9077915021041 34.5723480775864
12.8754032313702 53.1795899126135 34.1309377040482

但是我需要我的输出看起来完全像这样,Fortran 程序才能接受它。

***** SAMPLING PATTERN FILE

 50   3   1          0.0000
50
   87.54    62.84    17.00
   83.99    65.00    18.86
   84.44    63.68    18.63
   84.76    65.46    17.62
   13.46    16.99    49.68
   23.99    18.65    48.42
   17.05    11.51    43.04
   57.51    40.48    24.93
   11.83    52.90    34.57
   12.87    53.17    34.13

我应该注意,我完全知道如何在 r 中进行舍入:

m=round(m$X,digits=2)

我最好的选择是简单地使用 write.table 然后“手动”格式化。然后,我的大部分模型将在我用 Fortran 编写的循环中创建。如果是这样的话,我只需要在 MixSim 中生成几十个模型,然后格式化它们。所有模型的得分都远远超过 10 分。

【问题讨论】:

  • 您可以使用df <- signif(df, 4); write.table(df, 'df.txt', sep = '\t', row.names = FALSE, quote = FALSE) 非常接近,但没有标题,并且由于某种原因它似乎丢弃了尾随零。肯定有人按照read.fortran 编写了一个特定于 Fortran 的写入函数,但我不确定它是什么。
  • 我认为您可以将round 应用于整个data.frame。 write.table 可以有 sep="\t" 说它应该“看起来像这样”并没有多大帮助。那些项目“50 3 1 0.0000\n 50”是什么,......是否需要有代码格式的第一行?尽可能具体。
  • @42,是的,所有这些都需要在那里。 50 是样本数,3 是组数,1 应该是维数(在此示例中),0.000 是随机生成的数字所在的占位符。 write.table 似乎截断了我的小数位,并且没有根据需要将每个元素设置为 4 个空格。

标签: r write.table


【解决方案1】:

(使用 write.table 尝试了各种方法,但当尾随数字为 nn.00 时,总是会意外截断十进制值。)

使用cat 作为文件序言,write.fwf 来自 pkg::gdata:

cat(top, file='out.txt')
install.packages('gdata')
gdata::write.fwf(signif(dat,4), file = "out.txt", append = TRUE, quote = FALSE, sep = "\t", 
                   colnames = FALSE)

-------result----------
***** SAMPLING PATTERN FILE

 50   3   1          0.0000
50
87.54   62.84   17.00
83.99   65.01   18.87
84.45   63.69   18.64
84.77   65.46   17.63
13.46   17.00   49.68
24.00   18.66   48.42
17.05   11.52   43.04
57.51   40.49   24.94
11.83   52.91   34.57
12.88   53.18   34.13

如果您需要在 LHS 上进行填充,您可以使用 width=7 或 8。

【讨论】:

  • 谢谢,这仍然需要在事后进行少量编辑,但我认为这可能是不可避免的,因为我使用的程序是在 Fortran 需要非常严格的缩进和列的时间点编写的.所以格式化过程将是一场恐怖表演,但现在比以前少了。
  • 缩进应该可以使用附加的“空白”字符串或空白列,在适当的位置可能带有" " 的列名。需要一个完整的例子来说明。在上面的示例中,我能够使用 cbind(data.frame(" "=" ", check.names=FALSE), m$X) 获得一个带有空白列名称的空白列
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多