14

我在 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从 MASS 库中玩,但都没有产生预期的结果。

我已经看到了一些类似这样的建议,但它似乎太复杂了,更重要的是,在使用write.table().

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


更新

按照贾斯汀在下面评论中的建议,我安装了 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)
4

6 回答 6

9

你也可以capture.output使用cat

cat(capture.output(dframe), file = 'dframe.txt', sep = '\n')
于 2012-11-27T22:51:44.783 回答
6

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

max.print <- getOption('max.print')
options(max.print=nrow(dframe) * ncol(dframe))
sink('dframe.txt')
dframe
sink()
options(max.print=max.print)
于 2012-11-27T18:51:09.420 回答
3

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

capture.output(
  print.data.frame(df, row.names=F, print.gap=3, quote=F, right=F),
  sep="\n", file="out.txt"
)
于 2015-05-05T08:48:44.113 回答
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)
于 2012-11-27T19:10:58.030 回答
1

我喜欢 Matthew Plourde 的简单回答,但不幸的是,它并没有为我的情况提供摆脱行名/编号的方法;所以,我稍微修改了里卡多的答案:

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 相同的输出。

编辑:替换trimtrimws.

于 2013-05-31T05:58:30.053 回答
1

根据 mnel 的答案,另一种没有行名的方法:

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)  
}  
于 2014-05-22T11:28:33.960 回答