2012-04-10 12 views
6

si tengo la siguiente trama de datos:encontrar el valor más alto dentro de los niveles de factor de

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 

cómo puedo obtener para cada Factora el valor más alto y la entrada de factorB asociada a ella es decir

value factorA factorB 

3   a  g 
3   b  m 
2   c  g 

Es esto sea posible sin usar primero

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

y luego clasificar cada bloque $ a como esta se llevará a cabo muchas veces y la cantidad de bloques siempre cambiará.

Respuesta

12

Aquí es una opción, usando funciones de 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 sus datos

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 función en plyr paquete

> 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 

O

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

Gracias, me ayudó a ver cómo se pueden agregar funciones dentro de ddply y que ddply tomará un df y lo colocará en cada x. – user1181337

Cuestiones relacionadas