insertar - Cómo seleccionar filas por grupo con el valor mínimo y que contienen NA en R
seleccionar filas en r (3)
Aquí hay un ejemplo:
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
Lo que me daré cuenta es seleccionar la única fila de X
con un mínimo de Y
al ignorar las NA
:
a 4 68
b 1 4
c 2 64
¿Cuál es la mejor manera de hacer eso?
Esto no selecciona las filas usando un índice, pero devuelve los valores que desea ...
ddply(data, .(X), summarise, min=min(Y, na.rm=T))
X min
1 a 5
2 b 1
3 c 4
EDITAR DESPUÉS DEL COMENTARIO : Para seleccionar las filas completas, puede:
ddply(data, .(X), function(x) arrange(x, Y)[1, ])
X Y Z
1 a 4 68
2 b 1 4
3 c 2 64
O
data$index <- 1L:nrow(data)
i <- by(data, data$X, function(x) x$index[which.min(x$Y)] )
data[i, ]
X Y Z index
1 a 4 68 1
6 b 1 4 6
10 c 2 64 10
Usando el paquete data.table
, esto es trivial:
library(data.table)
d <- data.table(data)
d[, min(Y, na.rm=TRUE), by=X]
También puede usar plyr
y su función ddply
:
library(plyr)
ddply(data, .(X), summarise, min(Y, na.rm=TRUE))
O usando la base R:
aggregate(X ~ ., data=data, FUN=min)
Basado en las ediciones, usaría data.table
seguro:
d[, .SD[which.min(Y)], by=X]
Sin embargo, hay soluciones que usan base R u otros paquetes.
Usar un subconjunto para cada letra puede ser que esto puede ayudar
data<-data.frame(X=rep(letters[1:3], each=4),Y=sample(1:12,12))
dataA <- subset(data, data$X=="a")
min(dataA$Y, na.rm=TRUE)