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 環境内で適切にフォーマットされて表示されるので、同じフォーマットのファイルに書き込むのは簡単だと思いました。どうやら私が間違っていたようです。format()私はMASSライブラリを使って遊んでみましwrite.matrixたが、どちらも望ましい結果をもたらしません.

このような提案をいくつか見たことがありますが、複雑すぎるように思われ、さらに重要なことに、を使用してファイルに出力すると、望ましい結果が得られません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)
}

これにより、行名/番号を除いてマシューと同じ出力が得られます。

編集:に置き換えtrimますtrimws

于 2013-05-31T05:58:30.053 に答える