2011-01-14 6 views
2

Ich möchte mit einmaligen Kombinationen von var1 und var2 arbeiten.R - mit eindeutigen Wertekombinationen berechnen

foo <- data.frame(var1= c(1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4), var2=c(1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 3, 3)) 

Wie bereits erwähnt wurde, unique(foo) Ergebnisse in dieser:

 var1 var2 
1 1  1 
2 2  1 
3 2  2 
4 3  1 
5 3  2 
6 4  2 
7 4  3 

Basierend auf den einzigartigen Kombinationen, wie bekomme ich die Anzahl der Vorkommen eines var1 Wert und die Summe jedes var1 Wert var2 Werte. Die Ausgabe könnte wie folgt aussehen:

 var1 n svar 
1  1  1 1 
2  2  2 3 
3  3  2 3 
4  4  2 5 

bearbeiten: Frage erweitert, Name der Summenvariablen geändert.

+1

erweiterte Antwort ihre Empfehlung zu adressieren Q – Chase

Antwort

4

unique(foo) sollten Sie geben, was Sie nach hier.

Ich empfehle in der Bibliothek plyr für andere aggregierende Art Aufgaben oder die Basis R-Äquivalente von tapply(), aggregate() et al.

Während für diese Übung überflüssig, hier, wie Sie plyr verwenden würden:

library(plyr) 
ddply(foo, .(var1), unique) 

Hinweis: Sie können mit einer beliebigen Anzahl von Funktionen, die nur ersetzen, wie die mittlere und sd von var2 finden wie so:

ddply(foo, .(var1), summarise, mean = mean(var2), sd = sd(var2)) 

Antwort

Jetzt haben Sie eine legitime Verwendung für plyr() haben zu bearbeiten. Nehmen, was wir von oben gelernt:

x <- unique(foo) 

mit plyr kombiniert:

ddply(x, .(var1), summarise, n = length(var2), sum = sum(var2)) 

Sie sollten geben, was Sie nach.

2

Ich hoffe, ich verstehe Ihre Frage gut, versuchen:

unique(foo) 

Nach Frage bearbeitet wurde:

nicht die gleiche wie @Chase, ein sehr einfacher, aber nicht zu schreiben elegante Lösung könnte sein:

foo$var12 <- paste(foo$var1, foo$var2, sep='|')  # the two variables combined to one 
table(foo$var12)          # and showing its frequencies 

Und das aus Put ist eine Tabelle, natürlich:

1|1 2|1 2|2 3|1 3|2 4|2 4|3 
    2 2 2 2 3 2 2 
1

Die Antworten sind anders als Sie angeben, aber ich vertraue meinen Code mehr, als ich Ihre Antwort vertrauen, und ich kann mich nicht dazu bringen, die Sünde der Namensgebung eine Variable „sum“ zu begehen:

newfoo <- data.frame(
       var1=unique(foo$var1), 
       n = with(foo, tapply(var2, var1, length)), 
       svar = with(foo, tapply(var2, var1, sum))) 
newfoo 
# var1 n svar 
#1 1 2 2 
#2 2 4 6 
#3 3 5 8 
#4 4 4 10 

EDIT: (hatte nicht gedacht zuerst heraus, was Chase tat versuchen, mir zu sagen.)

newfoo <- data.frame(
        var1=unique(unique(foo)$var1), 
        n = with(unique(foo), tapply(var2, var1, length)), 
        svar = with(unique(foo), tapply(var2, var1, sum))) 

> newfoo 
    var1 n svar 
1 1 1 1 
2 2 2 3 
3 3 2 3 
4 4 2 5 
+0

ich glaube, die Diskrepanz in Antworten hier sind, weil der OP die die Länge war auf der Suche und Summe des Objekts uniqu e (foo) 'nicht sein ursprünglicher Datenrahmen. Guter Punkt re: Benennung einer Spalte "sum". – Chase

+0

Ich denke es liegt daran, dass das "foo" in seinem Code anders ist als das "foo" in seiner tabellarischen Darstellung. Es gibt 4 "2" in dem Code-Vektor, aber er zählt 2 "2" s. –

+0

Die erste tabellarische Präsentation ist 'unique (foo)', nicht 'foo'. Die Zählung in der Tabelle unten verwendet auch 'unique (foo)'. – lecodesportif