首页 > 解决方案 > 将 data.frame 导出和格式化为 .dat 表

问题描述

我正在寻求帮助,从具有非常严格格式要求的遗留程序创建输入文件(例如df.dat) 。data.frame有了这个例子data.frame

location <- rep("GDWC1",6)
monyear <- rep(0215, 6)
day <- c(6,7,8,9,10,11)
value <- c(750.00, 3516.00, 8295.00, 11064.00, 3264.00, 111796.00)
df <- data.frame(location, monyear, day, value)
head(df)
# location monyear day  value
#1    GDWC1    0215   6    750
#2    GDWC1    0215   7   3516
#3    GDWC1    0215   8   8295
#4    GDWC1    0215   9  11064
#5    GDWC1    0215  10   3264
#6    GDWC1    0215  11 111796

我想要的文件导出(例如 .dat、.txt)格式是没有标题或行 ID,第一列和第二列之间有 6 个空格(始终是四个值 - 这里是 0215),右对齐的第三列(2-第 2 列和第 3 列之间有 3 个空格),第 3 列和第 4 列之间至少有 2 个空格,并添加.00到第 4 列并强制执行小数对齐。

所需的df.dat:

GDWC1      0215   6     750.00
GDWC1      0215   7    3516.00
GDWC1      0215   8    8295.00
GDWC1      0215   9   11064.00
GDWC1      0215  10    3264.00
GDWC1      0215  11  111796.00

write.table()在获得列间距、日期列的右对齐以及值列的小数对齐方面,我一直没有成功。有任何想法吗?谢谢!

标签: r

解决方案


这是一种方法sprintf

result <- apply(df,1,function(x){
  paste0(x["location"],
         sprintf("%6s",""),
         sprintf("%04s",x["monyear"]),
         sprintf("%4s",x["day"]),
         sprintf("%11.2f",as.numeric(x["value"]))
         )})
write.table(result,
            file = "file.dat",
            col.names = FALSE,
            row.names = FALSE,
            quote = FALSE)

system("cat file.dat")
GDWC1      0215   6     750.00
GDWC1      0215   7    3516.00
GDWC1      0215   8    8295.00
GDWC1      0215   9   11064.00
GDWC1      0215  10    3264.00
GDWC1      0215  11  111796.00

有关help(sprintf)格式如何工作的详细信息,请参阅。


推荐阅读