2012-10-15 14 views
9

Ich denke, das wird eine einfache Antwort haben, aber ich kann es nicht herausfinden! Hier ist ein Beispiel mit dem iris-Datensatz:Wie füge ich Tabellen in R zusammen?

a <- table(iris[,2]) 
b <- table(iris[,3]) 

Wie kann ich diese beiden Tabellen zusammen? Zum Beispiel hätte die Variable 3 einen Wert von 27 (26 + 1) und die Variable 3.3 einen Wert von 8 (6 + 2) in der neuen Ausgabetabelle.

Jede Hilfe sehr geschätzt.

Antwort

7

Das funktioniert, wenn Sie die Variablen verwenden möchten, die in beiden a vorhanden sind und b:

n <- intersect(names(a), names(b)) 
a[n] + b[n] 

# 3 3.3 3.5 3.6 3.7 3.8 3.9 4 4.1 4.2 4.4 
# 27 8 8 5 4 7 5 6 4 5 5 

Wenn Sie alle Variablen verwenden möchten:

n <- intersect(names(a), names(b)) 

res <- c(a[!(names(a) %in% n)], b[!(names(b) %in% n)], a[n] + b[n]) 

res[order(names(res))] # sort the results 
+0

+1 viel besser als meins. –

+0

Danke dafür. Kann es geändert werden, um die Werte beizubehalten, die in beiden Datasets nicht vorhanden sind und nur in einem vorhanden sind? Ich brauche eine Gesamtsumme, die ** alle ** Daten einschließlich der zusammengeführten gemeinsamen Werte enthält, wie Ihr Code gezeigt hat. – JPD

+0

@JPD Siehe das Update meiner Antwort. –

2
temp<-merge(a,b,by='Var1') 
temp$sum<-temp$Freq.x + temp$Freq.y 

    Var1 Freq.x Freq.y sum 
1  3  26  1 27 
2 3.3  6  2 8 
3 3.5  6  2 8 
4 3.6  4  1 5 
5 3.7  3  1 4 
6 3.8  6  1 7 
7 3.9  2  3 5 
8  4  1  5 6 
9 4.1  1  3 4 
10 4.2  1  4 5 
11 4.4  1  4 5 
+0

+1 nette Verwendung von 'merge()' –

2

Hier ist eine weitere:

transform(merge(a,b, by="Var1"), sum=Freq.x + Freq.y) 
    Var1 Freq.x Freq.y sum 
1  3  26  1 27 
2 3.3  6  2 8 
3 3.5  6  2 8 
4 3.6  4  1 5 
5 3.7  3  1 4 
6 3.8  6  1 7 
7 3.9  2  3 5 
8  4  1  5 6 
9 4.1  1  3 4 
10 4.2  1  4 5 
11 4.4  1  4 5 
1

Hier ist eine leicht gequälter Einzeiler Version der merge() Lösung:

do.call(function(Var1, Freq.x, Freq.y) data.frame(Var1=Var1, Freq=rowSums(cbind(Freq.x, Freq.y))), merge(a, b, by="Var1")) 

Hier ist das ein, wenn Sie alle Variablen verwenden mögen:

do.call(function(Var1, Freq.x, Freq.y) data.frame(Var1=Var1, Freq=rowSums(cbind(Freq.x, Freq.y), na.rm=TRUE)), merge(a, b, by="Var1", all=TRUE)) 

Im Gegensatz zum transform() Einzeiler, es akkumuliert keine .x und .y, so dass es iterativ verwendet werden kann.

Verwandte Themen