Hi, May be this helps: set.seed(45) dat <- data.frame(species=rep(letters[1:3],each=5),size=sample(40,15,replace=TRUE)) dat[3,2] <- 26 mat <- as.matrix(dat) tapply(mat[,2],mat[,1],FUN=which.max) ##assuming that you did something like this #a b c #1 3 2
indx <- unlist(tapply(mat[,2],mat[,1],FUN=function(x) x==max(x)),use.names=FALSE) dat[indx,] #or mat[indx,] # species size #1 a 26 #3 a 26 #8 b 23 #12 c 36 #or indx2 <-with(dat,ave(size,species,FUN=max)==size) #or #indx2 <- ave(mat[,2],mat[,1],FUN=max)==mat[,2] which(indx2) #[1] 1 3 8 12 dat[indx2,] A.K. Dear Friends, I have a question don't know how to resolve. I have a big matrix. There are two colum's names"species" and "size". I have used the function "tapply" to get every maxium "size" data for every factors "species". Now, I want to choose these rows containing maxium "size" for every factors in "species". I don't know how should I do. I know "which()" can get the row index for one data. But, how to cope with hundreds of data? Thank you very much! ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.