Как заставить Addna и Xtable работать вместе?

StackOverflow https://stackoverflow.com/questions/5806714

  •  24-10-2019
  •  | 
  •  

Вопрос

я использую xtabs Чтобы составить некоторые данные, которые содержат NAс Чтобы убедиться, что итоги завершены, я использую addNA Подсчитать те, которые с отсутствующими уровнями факторов.

Однако это вызывает проблемы при использовании xtable экспортировать в латекс для прокалывания, потому что есть NAS в строке и именах столбцов сейчас. У меня есть решение:

rownames(tab)[is.na(rownames(tab))]<-"NA"
colnames(tab)[is.na(colnames(tab))]<-"NA"

Но это может стать утомительным для множества столов, есть ли способ сделать это более автоматически? Или есть лучший способ производства столов в первую очередь?

Это было полезно?

Решение

Интересный вопрос. Я также не мог найти способ справиться с этим, используя сам extable. Таким образом, лучшее, что я могу предложить, - это превратить ваш обходной путь в небольшую функцию, которую можно легко назвать.

Например:

# Construct some data
df <- data.frame(
  x1 = addNA(sample(c(NA, LETTERS[1:4]), 100, replace = TRUE)),
  x2 = addNA(sample(c(NA, letters[24:26]), 100, replace = TRUE))
)

# Create a function to rename NA row and column names in a data.frame
rename_NA <- function(x){
  rownames(x)[is.na(rownames(x))] <- "NA"
  colnames(x)[is.na(colnames(x))] <- "NA"
  x
}

tab <- rename_NA(xtabs(~x1+x2, data=df))
xtable(tab)

Это создает допустимый латекс без ошибок:

% latex table generated in R 2.13.0 by xtable 1.5-6 package
% Wed Apr 27 17:20:21 2011
\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrrr}
  \hline
 & x & y & z & NA \\ 
  \hline
A & 4.00 & 7.00 & 10.00 & 4.00 \\ 
  B & 6.00 & 5.00 & 4.00 & 2.00 \\ 
  C & 8.00 & 4.00 & 4.00 & 2.00 \\ 
  D & 8.00 & 5.00 & 1.00 & 6.00 \\ 
  NA & 5.00 & 2.00 & 7.00 & 6.00 \\ 
   \hline
\end{tabular}
\end{center}
\end{table}

Другие советы

Другое решение, которое нужно рассмотреть, - использовать модифицированные addNA Чтобы позволить ему вывести уровень фактора в качестве строки в первую очередь:

addNA2 <- function (x, ifany = FALSE, as.string = TRUE)
{
    if (!is.factor(x)) 
        x <- factor(x)
    if (ifany & !any(is.na(x))) 
        return(x)
    ll <- levels(x)
    if (!any(is.na(ll))) 
        ll <- c(ll, NA)
    x <- factor(x, levels = ll, exclude = NULL)
    if(as.string) levels(x)[is.na(levels(x))] <- "NA"
    x
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top