【问题标题】:Print a data frame with columns aligned (as displayed in R)打印列对齐的数据框(如 R 所示)
【发布时间】:2012-11-15 11:12:12
【问题描述】:

我在 R 中有以下数据框:

> dframe
                Mean Median
Candidates     85.68     60
NonCands        9.21      4
Multi          27.48     17
Mono            4.43      3
Multi NonCands 22.23     15

我想将它打印到一个文件中,并保持其良好的格式和对齐方式,如上所示。我用:

write.table(dframe,file="test",sep="\t", quote=F)

产生以下输出:

Mean    Median
Candidates  85.68   60
NonCands    9.21    4
Multi   27.48   17
Mono    4.43    3
Multi NonCands  22.23   15

由于数据在 R 环境中以正确格式显示,我认为将其写入具有相同格式的文件应该很简单。显然我错了。我曾尝试使用 MASS 库中的 format()write.matrix,但都没有产生预期的结果。

我看到了一些类似this one 的建议,但它似乎太复杂了,更重要的是,在使用write.table() 打印到文件时不会产生预期的结果。

那么,如何将我的数据框打印到文本文件中并让它看起来就像在 R 中一样?


更新

根据 Justin 在下方评论中的建议,我安装了 gdata 库并使用了 write.fwf。这几乎是我需要的:

write.fwf(dframe,file="test",sep="\t", quote=F, rownames=T)

产生以下输出:

Mean    Median
Candidates      85.68   60
NonCands         9.21    4
Multi           27.48   17
Mono             4.43    3
Multi NonCands  22.23   15

那么,关于如何让“平均值”和“中位数”向右移动以使其与各自的列对齐的任何想法?

因为它现在可能是相关的,所以 data.frame 的创建方式如下:

labels<-c("Candidates","NonCands","Multi", "Mono", "Multi NonCands")
Mean <- c(mean(cands), mean(non),mean(multi),mean(mono),mean(multi_non))
Median <- c(median(cands), median(non),median(multi),median(mono),median(multi_non))
names(Mean)<-labels
dframe<-data.frame(Mean,Median)

【问题讨论】:

  • 看看write.fwf 来自gdata 包。 fwf 代表固定宽度文件。但是,如果用于查看文本文件的字体不是固定宽度,它可能不是均匀的。
  • @Justin,谢谢,请参阅更新后的问题。
  • 确切地说,您希望行名左对齐和填充,列右对齐。 (print.data.frame(... right=X) 只允许全局设置该选项,因此需要稍作调整)。

标签: r dataframe text-alignment output-formatting


【解决方案1】:

您可以将print 的输出重定向到文件。

max.print <- getOption('max.print')
options(max.print=nrow(dframe) * ncol(dframe))
sink('dframe.txt')
dframe
sink()
options(max.print=max.print)

【讨论】:

  • 如果行数大于max.print 值,您可能会遇到getOption("max.print") 问题。
  • @MatthewPlourde,请看下面我的回答,有没有办法在你的简单解决方案中摆脱行名/数字?
  • @Sezen 您可以将 data.frame 转换为矩阵并将它们全部设置为空字符。
【解决方案2】:
# Add the row names to the data frame, if you want them included
dframe2 <- data.frame("Row"=rownames(dframe), dframe, stringsAsFactors=FALSE)

# apply format over each column
dframe2 <- apply(dframe2, 2, format)

# print it out, make sure not to use quotes
write.table(dframe2, "test.txt", quote=FALSE, row.names=FALSE)

【讨论】:

    【解决方案3】:

    您也可以将capture.outputcat 一起使用

    cat(capture.output(dframe), file = 'dframe.txt', sep = '\n')
    

    【讨论】:

    • capture.output 本身也有一个 file 参数。
    【解决方案4】:

    我喜欢 Matthew Plourde 的 answer 的简单性,但不幸的是,它没有提供一种方法来摆脱我的情况下的行名/编号;所以,我稍微修改了一下里卡多的 answer

    print.to.file <- function(df, filename) {
      cnames <- colnames(df)
      n      <- as.matrix(nchar(cnames))
    
      d <- apply(df, 2, format)
      n <- apply(cbind(n, nchar(d[1,])), 1, max)
    
      fmts <- paste0("%",n, "s")
      for(i in 1:length(cnames)) {
        cnames[i] <- sprintf(fmts[i], cnames[i])
        d[,i] <- sprintf(fmts[i], trimws(d[,i]))
      }
      d <- rbind(cnames, d)
      write.table(d, filename, quote=F, row.names=F, col.names=F)
    }
    

    除了行名/数字之外,这给出了与 Matthew 相同的输出。

    编辑:trim替换为trimws

    【讨论】:

    • 不幸在使用最新的R...Error in trim(d[, i]) : could not find function "trim"
    【解决方案5】:

    基于 mnel 的answer 的另一种没有行名的方式:

    prettyprint.df <- function(x, filename='dframe.txt', width=200)  
       # Pretty-print data frame without row names  
    {  
       op.w <- options("width")  
       options("width"=width)  
    
       first <- max(nchar(rownames(x))) + 2  
       cat(substring(capture.output(x), first), file=filename, sep="\n")  
    
       options(op.w)  
    }  
    

    【讨论】:

      【解决方案6】:

      要控制输出,请根据您的需要调整 print.data.frame 并将输出捕获到文件中,例如:

      capture.output(
        print.data.frame(df, row.names=F, print.gap=3, quote=F, right=F),
        sep="\n", file="out.txt"
      )
      

      【讨论】:

      • 如何打印到文件
      • 它没有。我专注于格式化数据框的问题。
      • 谢谢,但数据框在 R 中完美显示。问题是关于将其打印到文件中,因此您的答案在这里并不重要。
      • 完全改写答案
      • sep="\n" 在 R 4.0.2 中为我提供了来自 capture.output() 的“错误参数”错误。删除它似乎可以提供很好的输出。
      猜你喜欢
      • 2012-10-10
      • 2021-02-19
      • 2018-12-02
      • 2018-05-14
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2014-12-11
      • 2021-09-29
      相关资源
      最近更新 更多