Frage

a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)

r<-sapply(split(a.3,a.2),function(x) which.max(x$b.2))

a.3[r,]

gibt den Listenindex, den Index nicht für die gesamte data.frame

Im Versuch, den größten Wert von b.2 für jede Untergruppe von a.2 zurückzukehren. Wie kann ich effizient das?

War es hilfreich?

Lösung

a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)

Die Antwort von Jonathan Chang bekommt man, was man explizit gefragt, aber ich vermute, dass Sie die aktuelle Zeile aus dem Datenrahmen werden sollen.

sel <- ave(b.2, a.2, FUN = max) == b.2
a.3[sel,]

Andere Tipps

Die ddply und ave Ansätze sind beide ziemlich ressourcenintensiv, denke ich. ave nicht durch die für ein aktuelles Problem der Speicher läuft aus (67.608 Zeilen, mit vier Säulen, die einzigartigen Schlüssel definiert wurden). tapply ist eine praktische Wahl, aber was ich in der Regel tun muß, ist wählen Sie alle die ganzen Zeilen mit dem etwas-est some-Wert für jeden eindeutigen Schlüssel (in der Regel um mehr als eine Spalte definiert). Die beste Lösung, die ich gefunden habe, ist eine Art zu tun und dann Negation duplicated verwendet nur die erste Zeile für jeden eindeutigen Schlüssel zu wählen. Für das einfache Beispiel hier:

a <- sample(1:10,100,replace=T)
b <- sample(1:100,100,replace=T)
f <- data.frame(a, b)

sorted <- f[order(f$a, -f$b),]
highs <- sorted[!duplicated(sorted$a),]

ich denke, die Performance-Gewinne über ave oder ddply zumindest erheblich ist. Es ist etwas komplizierter für mehrspaltigen Schlüssel, aber order wird eine ganze Reihe von Dingen zu sortieren und duplicated Arbeiten an Datenrahmen handhaben, so dass es möglich ist, diesen Ansatz weiter zu verwenden.

library(plyr)
ddply(a.3, "a.2", subset, b.2 == max(b.2))
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)
m<-split(a.3,a.2)
u<-function(x){
    a<-rownames(x)
    b<-which.max(x[,2])
    as.numeric(a[b])
    }
r<-sapply(m,FUN=function(x) u(x))

a.3[r,]

Dies funktioniert der Trick, wenn auch etwas umständlich ... Aber es erlaubt mir die Zeilen für die groupwise größten Werte zu greifen. Jede andere Ideen?

> a.2<-sample(1:10,100,replace=T)
> b.2<-sample(1:100,100,replace=T)
> tapply(b.2, a.2, max)
 1  2  3  4  5  6  7  8  9 10 
99 92 96 97 98 99 94 98 98 96 
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)

Mit aggregate, können Sie das Maximum für jede Gruppe in einer Zeile erhalten:

aggregate(a.3, by = list(a.3$a.2), FUN = max)

Dies erzeugt die folgende Ausgabe:

   Group.1 a.2 b.2
1        1   1  96
2        2   2  82
...
8        8   8  85
9        9   9  93
10      10  10  97
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top