Ejemplo de filas aleatorias en dataframe


Estoy luchando para encontrar la función adecuada que devolvería un número especificado de filas recogidas aleatoriamente sin reemplazo de un marco de datos en lenguaje R? ¿Alguien puede ayudarme?

Author: smci, 2011-11-25

7 answers

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
 342
Author: John Colby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-25 19:15:13

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

sample_n(df, 10)

Muestrea aleatoriamente 10 filas del dataframe. Llama a sample.int, por lo que realmente es la misma respuesta con menos escritura (y simplifica el uso en el contexto de magrittr ya que el dataframe es el primer argumento).

 129
Author: kasterma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 19:16:33

Escriba uno! Envolver la respuesta de JC me da:

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

Ahora hazlo mejor comprobando primero si n

 27
Author: Spacedman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-25 19:21:29

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
 25
Author: gented,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-03 10:09:39

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

En mi paquete R he mejorado sample para que ahora se comporte como se espera también para las tramas 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)
    a b
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 sample un método genérico S3 y proporcionando la funcionalidad necesaria (trivial) en una función. Una llamada a setMethod soluciona todo. La implementación original todavía se puede acceder a través de base::sample.

 7
Author: krlmlr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:21

En mi paquete R hay una 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)
    a b
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 sampleconvirtiéndola en una función S3 genérica fue una mala idea, según los comentarios de Joris Meys a una respuesta anterior.

 4
Author: krlmlr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:32

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 pasado a sample es un rango desde 1 hasta el final de su tibble. El segundo parámetro pasado a la muestra, 150, es cuántos muestreos aleatorios desea. El corte entre corchetes especifica las filas de los índices devueltos. La Variable 'a' obtiene el valor del muestreo aleatorio.

 1
Author: Eric Leschinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-11 09:04:15