Распечатайте фрейм данных с выровненными столбцами (как показано в 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, я подумал, что их запись в файл с таким же форматом должна быть тривиальной. Видимо я ошибся. Я пробовал играть с 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)

person terdon    schedule 27.11.2012    source источник
comment
взгляните на write.fwf из пакета gdata. fwf обозначает файл с фиксированной шириной. однако, если шрифт, используемый для просмотра текстового файла, не имеет фиксированной ширины, он может быть нечетным.   -  person Justin    schedule 27.11.2012
comment
@Justin, спасибо, см. обновленный вопрос.   -  person terdon    schedule 27.11.2012
comment
Чтобы быть точным, вы хотите, чтобы имена строк были выровнены по левому краю и дополнены, а столбцы — по правому краю. (print.data.frame(... right=X) позволяет установить этот параметр только глобально, поэтому требуется небольшая настройка).   -  person smci    schedule 26.06.2015


Ответы (5)


Вы можете перенаправить вывод print в файл.

max.print <- getOption('max.print')
options(max.print=nrow(dframe) * ncol(dframe))
sink('dframe.txt')
dframe
sink()
options(max.print=max.print)
person Matthew Plourde    schedule 27.11.2012
comment
Вы можете столкнуться с проблемой getOption("max.print"), если количество строк превышает значение max.print. - person Sezen; 31.05.2013
comment
@MatthewPlourde, посмотрите мой ответ ниже, есть ли способ избавиться от имен/номеров строк в вашем простом решении? - person Sezen; 31.05.2013
comment
@Sezen Вы можете преобразовать data.frame в матрицу и установить для них все пустые символы. - person Matthew Plourde; 31.05.2013

Вы также можете использовать capture.output с cat

cat(capture.output(dframe), file = 'dframe.txt', sep = '\n')
person mnel    schedule 27.11.2012
comment
capture.output также принимает параметр file. - person jnas; 07.05.2015

Чтобы управлять выводом, настройте print.data.frame под свои нужды и сохраните вывод в файл, например:

capture.output(
  print.data.frame(df, row.names=F, print.gap=3, quote=F, right=F),
  sep="\n", file="out.txt"
)
person jnas    schedule 05.05.2015
comment
Как это печатается в файл? - person terdon; 05.05.2015
comment
Это не. Я сосредоточился на вопросе форматирования фрейма данных. - person jnas; 05.05.2015
comment
Спасибо, но датафрейм отлично отображается в R. Вопрос о его печати в файл, поэтому ваш ответ здесь не очень актуален. - person terdon; 05.05.2015
comment
Полностью переписал ответ - person jnas; 07.05.2015
comment
sep="\n" выдает ошибку неправильного аргумента от capture.output() для меня в R 4.0.2. Отбрасывание его, кажется, дает прекрасный результат. - person Krister Janmore; 07.05.2021

Другой способ без имен строк на основе ответа 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)  
}  
person jpjns    schedule 22.05.2014

Мне понравилась простота ответа Мэтью Плурда, но, к сожалению, он не предлагает способа избавиться от имен строк. /цифры для моей ситуации; поэтому я немного изменил ответ Рикардо:

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

Это дает тот же результат, что и у Мэтью, за исключением имен/номеров строк.

EDIT: замените trim на trimws.

person Sezen    schedule 31.05.2013
comment
К сожалению, при использовании последней версии R... Error in trim(d[, i]) : could not find function "trim" - person AF7; 17.11.2017