В swave, xtable, поверните только некоторые имена столбцов

Допустим, я хочу сделать таблицу в переплетении, например:

<<tab2.1 , results = "asis", echo=FALSE, warning=FALSE>>=
library(xtable)
df <- data.frame(Fish=1:5, Bird=11:15)

rownames(df) <- 2013:2017

print(xtable(df),
      rotate.colnames = TRUE)
@

введите описание изображения здесь

Теперь я хотел бы иметь метку сюжета в свободном пространстве над годами и слева от FishBird, но без вращения. Я попытался посмотреть руководство по xtable, но оно не показывает, как вращать только некоторые имена столбцов.


person Jeppe Olsen    schedule 02.05.2017    source источник


Ответы (3)


Вот обходной путь. Сначала я помещаю годы в столбец и определяю свою собственную функцию для управления именами столбцов. Это позволяет мне заменить имя первого столбца (в моем примере кода здесь: rotated[1]) на что-то другое.

library(xtable)
df <- data.frame(rows = 2013:2017, Fish=1:5, Bird=11:15)
# note that the rownames have their own column

print(xtable(df), include.rownames = F, 
      sanitize.colnames.function = function(x){
        rotated <- paste("\\begin{sideways}", x, "\\end{sideways}") 
        # put all column names into sideways environments for the rotation.
        return(c("Need coffee!", paste(rotated[-1], collapse="&")))} 
        # replaces first column name with something else (not rotated).
)

\begin{table}[ht]
\centering
\begin{tabular}{rrr}
  \hline
Need coffee! & \begin{sideways} Fish \end{sideways} &\begin{sideways} Bird \end{sideways} \\ 
  \hline
2013 &   1 &  11 \\ 
  2014 &   2 &  12 \\ 
  2015 &   3 &  13 \\ 
  2016 &   4 &  14 \\ 
  2017 &   5 &  15 \\ 
   \hline
\end{tabular}
\end{table}

Обратите внимание, что вы все еще можете иметь свои имена строк. Следующее работает так же хорошо:

df <- data.frame(Fish=1:5, Bird=11:15)
rownames(df) <- 2013:2017
print(xtable(tibble::rownames_to_column(df)), include.rownames = F, 
      sanitize.colnames.function = function(x){
        rotated <- paste("\\begin{sideways}", x, "\\end{sideways}") 
        return(c("Need coffee!", paste(rotated[-1], collapse="&")))} 
)
person coffeinjunky    schedule 02.05.2017
comment
Это работает, но было бы неплохо сохранить имена строк, так как я использую их в своих реальных данных. +1, но я подожду с принятием, чтобы узнать, доступно ли другое решение с использованием row.names :) - person Jeppe Olsen; 02.05.2017
comment
Ну, если проблема в том, что вы не хотите менять фрейм данных, просто оберните его в tibble::rownames_to_column при переходе к xtable. Я отредактировал свое решение, чтобы показать вам, как это сделать. - person coffeinjunky; 02.05.2017

Другая возможность (с использованием моего собственного пакета huxtable):

library(huxtable)
df <- data.frame(Fish=1:5, Bird=11:15)
rownames(df) <- 2013:2017
ht <- hux(df, add_rownames = TRUE, add_colnames = TRUE)
ht[1, 1] <- 'Your advert here'
number_format(ht) <- 0
rotation(ht)[1, 2:3] <- 90
ht

введите здесь описание изображения

person Community    schedule 02.05.2017

Другой вариант, если вы не хотите напрямую работать с кодом LaTeX, — использовать pixiedust, что позволяет вам выбирать, какие столбцы будут изменены.

\documentclass{article}
\usepackage{amssymb}
\usepackage{arydshln}
\usepackage{caption}
\usepackage{graphicx}
\usepackage{hhline}
\usepackage{longtable}
\usepackage{multirow}
\usepackage[dvipsnames,table]{xcolor}
\begin{document}
\SweaveOpts{concordance=TRUE}

<<tab2.1, results = tex>>=
df <- data.frame(Year = 2013:2017, Fish=1:5, Bird=11:15)

library(pixiedust)
options(pixiedust_print_method = "latex") # This option must be set in Rnw files

dust(df) %>%
  medley_bw() %>%
  sprinkle(cols = c("Fish", "Bird"),
           rotate_degree = 90,
           part = "head") %>%
  print() %>%
  cat()
@


\end{document}
person Benjamin    schedule 02.05.2017
comment
Я получаю сообщение об ошибке в eval(exp, envir, enclos): объект 'tex' не найден. - person Jeppe Olsen; 02.05.2017
comment
Какой файл вы используете? Я использую файл .Rnw в R Studio. - person Benjamin; 02.05.2017
comment
Да, я использую то же самое. Думаю, мне не хватает Tex (в моем PATH?) - person Jeppe Olsen; 02.05.2017
comment
странно, когда я использую results = "asis" (как в вашем примере), я получаю сообщение об ошибке Error in match.arg(options$results, c("verbatim", "tex", "hide")) : 'arg' should be one of "verbatim", "tex", "hide" Попробуйте использовать "asis" и посмотрите, подходит ли это вам. - person Benjamin; 02.05.2017