una - Muestra filas aleatorias en el marco de datos
generar muestras aleatorias en r (7)
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
¿Estoy luchando para encontrar la función apropiada que devolvería un número específico de filas elegidas al azar sin reemplazo de un marco de datos en lenguaje R? ¿Puede alguien ayudarme?
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 la sample
al convertirla en una función S3 genérica fue una mala idea, según los comentarios de Joris Meys a una respuesta anterior .
Escribe uno! Envolver la respuesta de JC me da:
randomRows = function(df,n){
return(df[sample(nrow(df),n),])
}
Ahora haga que sea mejor comprobando primero si n <= nrow (df) y deteniéndose con un error.
La respuesta que da John Colby es la respuesta correcta. Sin embargo, si usted es un usuario de dplyr
también existe la respuesta sample_n
:
sample_n(df, 10)
muestrea aleatoriamente 10 filas del marco de datos. Llama a sample.int
, así que realmente es la misma respuesta con menos escritura (y simplifica el uso en el contexto de magrittr ya que el marco de datos es el primer argumento).
Primero haz 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 selecciona 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
EDITAR : Esta respuesta ahora está desactualizada, ver 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)
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 achieved haciendo una sample
un método genérico S3 y proporcionando la funcionalidad necesaria (trivial) en una función. Una llamada a setMethod
arregla todo. Se puede acceder a la implementación original a través de base::sample
.
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 pasado a la muestra, 150, es la cantidad de muestreos aleatorios que desea. El corte de corchetes especifica las filas de los índices devueltos. La variable ''a'' obtiene el valor del muestreo aleatorio.