Question

J'utilise xtabs pour compiler des données qui contient NAs. 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 NAs 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?

Était-ce utile?

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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top