selezionare le righe con grande valore della variabile all'interno di un gruppo di r

StackOverflow https://stackoverflow.com/questions/2822156

  •  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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top