打印列对齐的数据框(如R所示)



我在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,但都没有产生所需的结果。

我看到了一些类似这样的建议,但它似乎太复杂了,更重要的是,在使用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

那么,关于如何将"均值"one_answers"中值"向右移动,使它们与各自的列对齐,有什么想法吗?

由于它现在可能是相关的,以下是数据帧的创建方式:

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)

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

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

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

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

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

capture.output(
print.data.frame(df, row.names=F, print.gap=3, quote=F, right=F),
sep="n", file="out.txt"
)
# 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)

基于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)  
}  

我喜欢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相同的输出,除了行名称/数字。

编辑:trimws替换trim

相关内容

  • 没有找到相关文章

最新更新