2013-05-07 9 views
8

Gibt es eine einfache Möglichkeit, die Zählwerte für jede Kategorie in zwei großen Tabellen in R hinzuzufügen?Einfache Möglichkeit, zwei große Tabellen in R "hinzuzufügen"?

... wo die Tische müssen nicht alle genau die gleichen Werte vorhanden (obwohl sie meist überlappen):

Kleines Beispiel von dem, was ich zu tun versuchen. Legen Sie einige Daten auf:

x1 <- c(5, 3, 3, 6, 3, 3, 5, 5, 11, 2, 4, 9, 3, 5, 8, 2, 8, 5, 4, 8) 
    x2 <- c(6, 10, 9, 17, 6, 7, 8, 11, 5, 12, 14, 5, 11, 7, 7) 

    table(x1) 
x1 
2 3 4 5 6 8 9 11 
2 5 2 5 1 3 1 1 

table(x2) 
x2 
5 6 7 8 9 10 11 12 14 17 
2 2 3 1 1 1 2 1 1 1 

Jetzt möchte ich diese Tabellen kombinieren, als ob ich table(c(x1,x2)) getan hatte, bekommen:

2 3 4 5 6 7 8 9 10 11 12 14 17 
2 5 2 7 3 3 4 2 1 3 1 1 1 

Aber jetzt x1 und x2 vorstellen, sind weg (und sind wirklich groß, so ich wirklich nicht wollen sie aus den Tabellen erstellen und tatsächlich tun table(c(x1,x2))), alles, was ich will ihr die Tabellen zu nehmen ist t1 und t2 und fügen sie (oft sehr groß) zählt ... die ich in mehreren tun können Ja wirklich klobige Wege.

Doch dies scheint, wie es beide sehr häufig und sehr sein sollte Problem leicht gelöst (in der Tat, ich denke, dass t1 + t2 sollte für Tabellen mit Kategorien arbeiten vom gleichen Typ), aber bei Fragen zu jedem Suchbegriff gesucht Ich könnte denken, von nichts gefunden haben.

Habe ich einen wirklich einfachen und offensichtlichen Weg verpasst, dies zu tun?

Edit:

Um zu klären, so etwas wie dies (was ich auch tat) ist nicht ‚einfach und klar‘ für das, was muss mit Tabellen eine sehr häufige Operation sein:

m <- merge(t1,t2,by.x="x1",by.y="x2",all=TRUE) 
m[is.na(m)] <- 0 
oo <- order(m$x1) 
t12 <- m[oo,2]+m[oo,3] 
names(t12) <- m[oo,1] 

Insbesondere dieser ist wirklich nicht einfacher und einfacher zu folgen als der Brute-Force-Ansatz.

+0

Sie sollten einen Blick auf ' fusionieren. –

+0

@PaulHiemstra tat ich vor dem Posten. Ich habe auch eine ganze Weile damit gespielt. Ich sah keinen guten Weg, um das zu tun, was ich wollte (leichter als durch rohe Gewalt). Es ist möglich, dass ich etwas verpasst habe, aber in diesem Fall ... Ich brauche mehr einen Hinweis als das. –

+1

Ihr Leben wird viel einfacher sein, wenn Sie Datenrahmen anstelle von Tabellen verwenden. Tabellen sind nur benannte Vektoren und im Allgemeinen gibt es wenige R-Funktionen zum Ausrichten und Kombinieren benannter Vektoren und viele für Datenrahmen. – hadley

Antwort

8

Ein anderer Weg tapply mit:

tapply(c(t1,t2), names(c(t1,t2)), sum) 
# 10 11 12 14 17 2 3 4 5 6 7 8 9 
# 1 3 1 1 1 2 5 2 7 3 3 4 2 

Ist hier, wenn Sie eine sortierte Ausgabe wollen:

w <- c(t1,t2) 
# edit: Following G.Grothendieck's suggestion to simplify it further 
tapply(w, as.numeric(names(w)), sum) 
# 2 3 4 5 6 7 8 9 10 11 12 14 17 
# 2 5 2 7 3 3 4 2 1 3 1 1 1 
+0

+1 gute Idee, war auf der Suche nach so etwas. – juba

+0

Ah, ordentlich. Ja, sortierte Ausgabe wird benötigt. Dieser zweite Weg wird sich mit wenig Aufwand auf viele Tische erstrecken. –

1

Wie @PaulHiemstra sagte, merge sollte die Aufgabe erledigen. Ich bin nicht allzu vertraut mit ihm, aber dieser Code funktionieren soll (obwohl es vielleicht effiziente Art und Weise, es zu tun ...)

x1 <- c(5, 3, 3, 6, 3, 3, 5, 5, 11, 2, 4, 9, 3, 5, 8, 2, 8, 5, 4, 8) 
x2 <- c(6, 10, 9, 17, 6, 7, 8, 11, 5, 12, 14, 5, 11, 7, 7) 

tx1 <- table(x1) 
tx2 <- table(x2) 

df1 <- data.frame(names=names(tx1),values=as.vector(tx1)) 
df2 <- data.frame(names=names(tx2),values=as.vector(tx2)) 

mdf12 <- merge(df1,df2,by="names",all=TRUE) 
mdf12[is.na(mdf12)] <- 0 

counts <- mdf12[,2] + mdf12[,3] 
names(counts) <- mdf12[,1] 

counts[order(as.numeric(names(counts)))] 
table(c(x1,x2)) 

ich nicht den is.na Schritt gefällt, aber ich weiß nicht, wie um es zu machen, dass es 0 an erster Stelle statt NA gibt.

+0

Danke, ja, ich habe tatsächlich etwas ziemlich nah dran, aber es scheint lächerlich kompliziert für das, was eine sehr häufige Operation mit Tisch sein muss. –

+0

Okay, tut mir leid, dass ich das mitbringe. Vielleicht kann ich diesen Post später löschen, als du deinen Beitrag editiert hast, dass du diese komplizierte Lösung schon vorher ausprobiert hast und @Arun eine passende Lösung gepostet hat (+1). –

+0

Der Fehler hier gehört mir; Ihre Antwort deckt * eine * Möglichkeit ab, dies zu tun, und in Ermangelung der Informationen, die ich später in die Bearbeitung miteinbezog, war eine vernünftige Antwort. Ich habe entsprechend aufgewertet. –

0

In dplyr:

library(dplyr) 
x1 <- c(5, 3, 3, 6, 3, 3, 5, 5, 11, 2, 4, 9, 3, 5, 8, 2, 8, 5, 4, 8) 
x2 <- c(6, 10, 9, 17, 6, 7, 8, 11, 5, 12, 14, 5, 11, 7, 7) 

# Transform "Tables" to DataFrames & standardize column names 
df1 <- as.data.frame(table(x1)) %>% select(x = x1, Freq) 
df2 <- as.data.frame(table(x2)) %>% select(x = x2, Freq) 

# Merge tables & aggregate results 
Ttldf <- bind_rows(df1, df2) %>% group_by(x) %>% summarise(TtlFreq = sum(Freq)) 

Für einen guten, prägnant int roduction zu einer Zusammenfassung und Rohrleitungen, die Vignette ist eine großartige Ressource: https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

Für weitere Informationen über die Möglichkeiten, schnell Verdichtung zu nutzen, um die beste Wirkung, Tutorial Markham ist sehr hilfreich: https://rpubs.com/justmarkham/dplyr-tutorial

Verwandte Themen