Here is an example:
set.seed(123)
data<-data.frame(X=rep(letters[1:3], each=4),Y=sample(1:12,12),Z=sample(1:100, 12))
data[data==3]<-NA
Using the data.table
package, this is trivial:
library(data.table)
d <- data.table(data)
d[, min(Y, na.rm=TRUE), by=X]
You can also use plyr
and its ddply
function:
library(plyr)
ddply(data, .(X), summarise, min(Y, na.rm=TRUE))
Or using base R:
aggregate(X ~ ., data=data, FUN=min)
Based on the edits, I would use data.table
for sure:
d[, .SD[which.min(Y)], by=X]
However, there are solutions using base R or other packages.