selezionare le righe con grande valore della variabile all'interno di un gruppo di r
-
26-09-2019 - |
Domanda
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,]
restituisce l'indice di lista, non l'indice per l'intera data.frame
Nel tentativo di restituire il più grande valore della b.2
per ogni sottogruppo di a.2
. Come posso fare questo in modo efficace?
Soluzione
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)
La risposta di Jonathan Chang si ottiene quello che hai chiesto esplicitamente, ma credo che si desidera che la riga reale dal frame di dati.
sel <- ave(b.2, a.2, FUN = max) == b.2
a.3[sel,]
Altri suggerimenti
Gli approcci ddply
e ave
sono entrambi abbastanza alta intensità di risorse, credo. ave
fallisce di esaurimento della memoria per il mio problema attuale (67,608 righe, con quattro colonne definendo le chiavi uniche). tapply
è una scelta a portata di mano, ma quello che in genere bisogno di fare è selezionare tutte le intere righe con il qualcosa-est un po 'di valore per ogni chiave unica (di solito definito da più di una colonna). La soluzione migliore che ho trovato è quello di fare una sorta e quindi utilizzare negazione della duplicated
per selezionare solo la prima riga per ogni chiave unica. Per l'esempio semplice qui:
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),]
Credo che l'incremento delle prestazioni oltre ave
o ddply
, almeno, sono notevoli. E 'un po' più complicata per i tasti a più colonne, ma order
gestirà un sacco di cose da ordinare su e opere duplicated
su frame di dati, in modo che sia possibile continuare a utilizzare questo approccio.
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,]
Questo fa il trucco, anche se un po 'complessa ... Ma mi permette di afferrare le righe per i valori più grandi di GroupWise. Tutte le altre idee?
> 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)
Con aggregate
, è possibile ottenere il massimo per ogni gruppo in una sola riga:
aggregate(a.3, by = list(a.3$a.2), FUN = max)
Questo produce il seguente output:
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