2012-04-04 8 views
6

tengo esta trama de datosselección de filas aleatoria en I

id <- c(1,1,1,2,2,3) 
name <- c("A","A","A","B","B","C") 
value <- c(7:12) 
df<- data.frame(id=id, name=name, value=value) 
df 

Esta función selecciona una fila aleatoria de ella:

randomRows = function(df,n){ 
    return(df[sample(nrow(df),n),]) 
} 

es decir

randomRows(df,1) 

Pero deseo seleccionar al azar una fila por 'nombre' (o por 'id' que es lo mismo) y concatenar toda la fila en una nueva tabla, por lo que en este caso, tres filas. Esto tiene que recorrer un marco de datos de más de 2000 filas. Por favor, enséñame cómo?

Respuesta

2

Creo que se puede hacer esto con el paquete plyr:

library("plyr") 
ddply(df,.(name),randomRows,1) 

que le da, por ejemplo:

id name value 
1 1 A  8 
2 2 B 11 
3 3 C 12 

¿Es esto lo que busca?

+0

Mi buen hombre que hace precisamente lo que estoy buscando! Función muy ordenada. ¡Gracias! – Bernard

+0

De nada. ¿Podría aceptar la respuesta para que otros sepan que la pregunta ha sido respondida? –

2

Aquí hay una manera de hacerlo en R. base de

> df.split <- split(df, df$name) 
> df.sample <- lapply(df.split, randomRows, 1) 
> df.final <- do.call("rbind", df.sample) 
> df.final 
    id name value 
A 1 A  7 
B 2 B 11 
C 3 C 12 
Cuestiones relacionadas