tablas seleccionar insertar filas eliminar datos data crear contar columna agrupar r dataframe na

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)