2011-06-07 4 views
2

Je génère deux tables en utilisant la commande table dans R. Je veux faire une table/dataframe/matrix de sorte que tous les noms des deux tables soient représentés et que les comptes 'zéro' soient inclus dans la sortie. par exemple.Comment obtenir deux listes ensemble dans R?

Les données que j'ai actuellement ressemble à quelque chose comme suit

Tableau 1

A B C 
1 2 4 

Tableau 2

C D E 
3 4 4 

Je voudrais avoir sortie qui est la suivante:

Table1 Table2 
A  1  0 
B  2  0 
C  4  3 
D  0  4 
E  0  4 

Comment puis-je faire cela dans R?

Répondre

5

sans Reshape:

t1 <- table(c("A", rep("B", 2), rep("C", 4))) 
t2 <- table(c(rep("C", 3), rep("D", 4), rep("E", 4))) 

ndf <- merge(t1, t2, by = "Var1", all = TRUE) 
ndf[is.na(ndf)] <- 0 
ndf 
    Var1 Freq.x Freq.y 
1 A  1  0 
2 B  2  0 
3 C  4  3 
4 D  0  4 
5 E  0  4 
+0

me battra juste un poil! ;) – joran

+0

+1 pensait que vous aviez besoin de fondre avant la fusion. – diliop

+0

Merci @EDi, c'est une bouée de sauvetage. – Sam

3

sans tenir compte de ce que je pense est une faute de frappe dans votre question (les fréquences C devraient être 4 et 3, à droite, pas 2 et 3?), Vous pouvez le faire en forçant les données cadres, puis la fusion:

t1 <- table(rep(LETTERS[1:3],times=c(1,2,4))) 
t2 <- table(rep(c("C","D",'E'),times=c(3,4,4))) 
merge(as.data.frame(t1),as.data.frame(t2),by="Var1",all=T) 

puis en convertissant les NA en zéros.

2

DONNÉES

dat <- list(rep(LETTERS[1:3],times=c(1,2,4)),rep(LETTERS[3:5],times=c(3,2,2))) 

CODE

f <- function(d){ 
     lev <- unique(unlist(d, use.names=FALSE)) 
     d <- lapply(d, factor, levels=lev) 
     r <- do.call(cbind, lapply(d, table)) 
     colnames(r) <- paste("Table", seq(NCOL(r)), sep="") 
     return(r) 
    } 

SORTIE

f(dat) 
    Table1 Table2 
A  1  0 
B  2  0 
C  4  3 
D  0  2 
E  0  2 
+0

Belle façon de montrer comment écrire (et utiliser) une fonction dans R. –

+0

Hi! C'est une bonne solution et une bonne démonstration. Je vous remercie. – Sam

Questions connexes