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?
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
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).
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
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
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
.
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 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.
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.
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