Как заставить Addna и Xtable работать вместе?
Вопрос
я использую xtabs
Чтобы составить некоторые данные, которые содержат NA
с Чтобы убедиться, что итоги завершены, я использую addNA
Подсчитать те, которые с отсутствующими уровнями факторов.
Однако это вызывает проблемы при использовании xtable
экспортировать в латекс для прокалывания, потому что есть NA
S в строке и именах столбцов сейчас. У меня есть решение:
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
}