我在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.output
与cat
一起使用
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
。