将data.frame写入R中具有特定格式的文本文件

时间:2012-11-19 23:01:28

标签: r

我使用R来访问一些旧的FORTRAN输入文件,并且在将数据帧下沉到文本文件并保持其格式方面存在一些问题。

我的方法是:

  1. 使用read.table导入数据。
  2. 调整一列中的数字(乘以标量)。
  3. 使用write.table函数保存所有内容。
  4. 我的代码:

    con <- file(paste(pth,'/Input/met/G_test.MET', sep=""))
    aaa <- read.table(con)
    aaa[,2]=aaa[,2]*0.1
    write.table(aaa)
    close(con)
    

    我的方法无法工作,因为它改变了输入文件的格式(它忽略了列之间的空格)。我的问题:是否有一个很好的方法来执行这三个步骤并保持相同的格式?我可以使用readLines来保留格式,然后我必须修改一个大循环中的所有数字。

    以下是数据的外观(我知道列之间的空格数):

     010192      0.00      0.04       8.3
     010292      0.33      0.02       7.5
     010392      0.61      0.23      11.7
     010492      0.00      0.04      10.0
     010592      0.00      0.07      10.6
     010692      0.00      0.02       8.9
     010792      0.00      0.19       9.4
     010892      0.00      0.30       9.4
     010992      0.00      0.08      11.4
    

    感谢您的任何建议。

    更新

    因为我必须维护格式并从一列更新数字。我提出了一种“混合”的方法。这种方法有效,但我很欣赏有关标准方法的建议。

    1. 使用readLines将数据作为字符加载,以保持格式并保持凝视零。
    2. 使用read.table将数据作为data.frame加载并修改它们
    3. 在循环中替换数字。

      con_rain<- file(paste(pth,'/Out_Test/GA1LEVAP.MET', sep=""))
      a_rain=readLines(con_rain)
      b_rain=read.table(con_rain) 
      
      for (i in 1:731){
        a_rain[i]=paste(substr(a_rain[i],1,13),sprintf("%3.2f", b_rain[i,2]*p[19]),substr(a_rain[i],18,37),sep="")
      }
      
      
      writeLines(a_rain, paste(pth,'/Out_Test/GA1LEVAP.MET', sep=""))
      

1 个答案:

答案 0 :(得分:2)

只提供适合的sep=参数。以下是6个空格后跟选项卡的示例:

R> head(trees)
  Girth Height Volume
1   8.3     70   10.3
2   8.6     65   10.3
3   8.8     63   10.2
4  10.5     72   16.4
5  10.7     81   18.8
6  10.8     83   19.7
R> write.table(trees, sep="      \t", 
+              file="/tmp/trees6spaces.txt", row.names=FALSE, col.names=FALSE)
R> system("head /tmp/trees6spaces.txt")
8.3         70          10.3
8.6         65          10.3
8.8         63          10.2
10.5        72          16.4
10.7        81          18.8
10.8        83          19.7
11          66          15.6
11          75          18.2
11.1        80          22.6
11.2        75          19.9
R>