Comment obtenir AdDNA et XTABLE à travailler ensemble?
Question
J'utilise xtabs
pour compiler des données qui contient NA
s. Afin de vous assurer que les totaux sont complets, j'utilise addNA
compter celles qui ont disparu des niveaux de facteur.
Cependant, cela pose des problèmes lors de l'utilisation xtable
à l'exportation vers LaTeX pour Sweaving parce qu'il ya NA
s dans la ligne et les noms de colonnes maintenant. J'ai une solution:
rownames(tab)[is.na(rownames(tab))]<-"NA"
colnames(tab)[is.na(colnames(tab))]<-"NA"
Mais cela peut devenir fastidieux pour beaucoup de tables, est-il un moyen de le faire plus automatiquement? Ou est-il une meilleure façon de produire les tables en premier lieu?
La solution
Question intéressante. Je ne pouvais pas trouver un moyen de faire face à cela en utilisant XTABLE lui-même, que ce soit. Donc, le meilleur que je peux suggérer est de transformer votre solution de contournement dans une petite fonction qui peut alors appeler facilement.
Par exemple:
# 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)
Cela crée latex valide sans erreur:
% 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}
Autres conseils
Une autre solution à envisager est d'utiliser un addNA
modifié pour lui permettre de produire le niveau de facteur comme une chaîne en premier lieu:
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
}