Muestra filas aleatorias en el dataframe

Estoy luchando para encontrar la función adecuada que devolvería un número específico de filas recogidas al azar sin reemplazo de un dataframe en el lenguaje R? ¿Puede alguien ayudarme?

Primero haga algunos datos:

> df = data.frame(matrix(rnorm(20), nrow=10)) > df X1 X2 1 0.7091409 -1.4061361 2 -1.1334614 -0.1973846 3 2.3343391 -0.4385071 4 -0.9040278 -0.6593677 5 0.4180331 -1.2592415 6 0.7572246 -0.5463655 7 -0.8996483 0.4231117 8 -1.0356774 -0.1640883 9 -0.3983045 0.7157506 10 -0.9060305 2.3234110 

Luego seleccione algunas filas al azar:

 > df[sample(nrow(df), 3), ] X1 X2 9 -0.3983045 0.7157506 2 -1.1334614 -0.1973846 10 -0.9060305 2.3234110 

La respuesta que da John Colby es la respuesta correcta. Sin embargo, si usted es un usuario dplyr también existe la respuesta sample_n :

 sample_n(df, 10) 

Muestras al azar 10 filas del dataframe. Llama a sample.int , así que realmente es la misma respuesta con menos tipeo (y simplifica el uso en el contexto de magrittr ya que el dataframe es el primer argumento).

¡Escribe uno! Envolver la respuesta de JC me da:

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

Ahora hazlo mejor verificando primero si n <= nrow (df) y deteniéndote con un error.

El paquete data.table proporciona la función DT[sample(.N, M)] , muestreando M filas aleatorias de la tabla de datos DT .

 library(data.table) set.seed(10) mtcars <- data.table(mtcars) mtcars[sample(.N, 6)] mpg cyl disp hp drat wt qsec vs am gear carb 1: 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 2: 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 3: 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 4: 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 5: 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 6: 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 

EDITAR : Esta respuesta ahora está desactualizada, vea la versión actualizada .

En mi paquete R, he mejorado la sample para que ahora se comporte como se espera también para los marcos de datos:

 library(devtools); install_github('kimisc', 'krlmlr') library(kimisc) example(sample.data.frame) smpl..> set.seed(42) smpl..> sample(data.frame(a=c(1,2,3), b=c(4,5,6), row.names=c('a', 'b', 'c')), 10, replace=TRUE) ab c 3 6 c.1 3 6 a 1 4 c.2 3 6 b 2 5 b.1 2 5 c.3 3 6 a.1 1 4 b.2 2 5 c.4 3 6 

Esto se logra haciendo que la sample un método genérico S3 y que proporcione la funcionalidad necesaria (trivial) en una función. Una llamada a setMethod corrige todo. Se puede acceder a la implementación original a través de base::sample .

En mi paquete R hay una sample.rows función sample.rows Solo para este propósito:

 install.packages('kimisc') library(kimisc) example(sample.rows) smpl..> set.seed(42) smpl..> sample.rows(data.frame(a=c(1,2,3), b=c(4,5,6), row.names=c('a', 'b', 'c')), 10, replace=TRUE) ab c 3 6 c.1 3 6 a 1 4 c.2 3 6 b 2 5 b.1 2 5 c.3 3 6 a.1 1 4 b.2 2 5 c.4 3 6 

Mejorar la sample convirtiéndola en una función S3 genérica fue una mala idea, según los comentarios de Joris Meys a una respuesta anterior .

Seleccione una muestra aleatoria de un tipo tibble en R:

 library("tibble") a <- your_tibble[sample(1:nrow(your_tibble), 150),] 

nrow toma un tibble y devuelve el número de filas. El primer parámetro que se pasa a la sample es un rango desde 1 hasta el final de su tibble. El segundo parámetro que se pasa a la muestra, 150, es la cantidad de muestras aleatorias que desea. El corte del corchete cuadrado especifica las filas de los índices devueltos. La variable 'a' obtiene el valor del muestreo aleatorio.