首页 > 解决方案 > 在行名前写有空格的表

问题描述

我有一个数据框,它写入顶部带有标题名称的表。这是一些可重现的代码。

library(gdata)
df = as.list(c(1:100))
df = unlist(df)
dim(df) = c(length(df)/5, 5)
array_name = as.data.frame(c("Data:"))
write.fwf(array_name,'new_file.txt',append=T,sep="     ",colnames=F,rownames=F,quote=F)
write.fwf(df,'new_file.txt',append=T,sep="      ",colnames=F,rownames=F,quote=F)

这是输出...

Data:
 1      21      41      61       81
 2      22      42      62       82
 3      23      43      63       83
 4      24      44      64       84
 5      25      45      65       85
 6      26      46      66       86
 7      27      47      67       87
 8      28      48      68       88
 9      29      49      69       89
10      30      50      70       90
11      31      51      71       91
12      32      52      72       92
13      33      53      73       93
14      34      54      74       94
15      35      55      75       95
16      36      56      76       96
17      37      57      77       97
18      38      58      78       98
19      39      59      79       99
20      40      60      80      100

我怎样才能让它看起来像这样......

Data:
        0:        1      21      41      61       81
        5:        2      22      42      62       82
       10:        3      23      43      63       83
       15:        4      24      44      64       84
       20:        5      25      45      65       85
       25:        6      26      46      66       86
       30:        7      27      47      67       87
       35:        8      28      48      68       88
       40:        9      29      49      69       89
       45:       10      30      50      70       90
       50:       11      31      51      71       91
       55:       12      32      52      72       92
       60:       13      33      53      73       93
       65:       14      34      54      74       94
       70:       15      35      55      75       95
       75:       16      36      56      76       96
       80:       17      37      57      77       97
       85:       18      38      58      78       98
       90:       19      39      59      79       99
      100:       20      40      60      80      100

所以,基本上我想:

1)添加以5为间隔的行名列。

2)使每一列在右边对齐。

3)将所有内容移到标题名称的右侧(与最后一行的第一个数字对齐 - 即“100”。

编辑/解决方案:

这就是我为解决问题所做的。我将“df”替换为“G”,因为这是我用于脚本的变量。

array_name <- as.data.frame(c("G:"))
G <- as.list(t(dflist2$`1`[2][!dflist2$`1`[2] == ""]))
G <- unlist(G)
dim(G) <- c(length(G)/5, 5)
G <- as.data.frame(G)
G <- cbind(row = 0, G)
for (x in 1:nrow(G)) {
  if (row.names(G[x,]) == "1") {G[x,"row"] = 0
  } else {G[x,"row"] = G[x-1,"row"]+5}
}
row.names(G) <- sprintf("   %i:", G$row)
G <- G[,-1]
write.fwf(array_name, 'new_file.txt', append = TRUE, sep = "", 
colnames = FALSE, rownames = FALSE, quote = FALSE)
write.fwf(G,'new_file.txt',append=TRUE,sep="      ", 
colnames=FALSE,rownames=TRUE,quote=FALSE) 

标签: r

解决方案


你真的需要花一些时间学习一两个 R 教程。您的代码中有很多冗余(创建一个列表然后将其取消列出)。我假设您并不是要在 90 和 100 之间降低 95,所以我从 5 而不是 0 开始:

df <- as.data.frame(matrix(1:100, 20, 5))
array_name <- "Data:"
writeLines(array_name, "new_file.txt")
row.names(df) <- sprintf("%8d:", seq(0, 95, by=5))
write.fwf(df, 'new_file.txt', append=TRUE ,sep="      ", colnames=FALSE,
     rownames=TRUE, quote=FALSE)

其中一些只是很好的做法,例如使用 <- 而不是 = 使您的代码更易于阅读。使用FALSE而不是 F.FALSE是保留字,不能重新分配。F 是可以重新分配的缩写。如果您在代码中的某处不小心将变量 F 分配给 0 以外的任何值,则您的代码已损坏。


推荐阅读