2012-04-10 16 views
6

se ho il seguente dataframe:trovare il valore più alto all'interno di livelli di fattore

value factorA factorB 
1   a   e 
2   a   f 
3   a   g 
1   b   k 
2   b   l 
3   b   m 
1   c   e 
2   c   g 

come posso ottenere per ogni Factora il valore più alto e la voce dalla factorB ad esso associati cioè

value factorA factorB 

3   a  g 
3   b  m 
2   c  g 

Is questo possibile senza prima utilizzare

blocks<-split(factorA, list(), drop=TRUE) 

e quindi classificare ciascun blocco $ a quanto questo sarà eseguita molte volte e il numero di blocchi cambierà sempre.

risposta

12

Qui è un'opzione, utilizzando le funzioni di base R:

maxRows <- by(df, df$factorA, function(X) X[which.max(X$value),]) 
do.call("rbind", maxRows) 
# value factorA factorB 
# a  3  a  g 
# b  3  b  m 
# c  2  c  g 
4

con i tuoi dati

df<- structure(list(value = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L), factorA = structure(c(1L, 
     1L, 1L, 2L, 2L, 2L, 3L, 3L), .Label = c("a", "b", "c"), class = "factor"), 
      factorB = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 1L, 3L), .Label = c("e", 
      "f", "g", "k", "l", "m"), class = "factor")), .Names = c("value", 
     "factorA", "factorB"), class = "data.frame", row.names = c(NA, 
     -8L)) 

Uso ddply funzione nel plyr pacchetto

> df2<-ddply(df,c('factorA'),function(x) x[which(x$value==max(x$value)),]) 
    value factorA factorB 
1  3  a  g 
2  3  b  m 
3  2  c  g 

Oppure,

> rownames(df2) <- df2$factorA 
> df2 
    value factorA factorB 
a  3  a  g 
b  3  b  m 
c  2  c  g 
+0

Grazie, mi ha aiutato a vedere come è possibile aggiungere funzioni all'interno di ddply e che ddply prenderà un df e lo metterà in ogni x. – user1181337

Problemi correlati