Estoy luchando por encontrar la función adecuada que devuelva un número específico de filas recogidas al azar sin reemplazo de un marco de datos en lenguaje R? ¿Puede alguien ayudarme?
333
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
?sample
en la consola R para leer sobre esa función.set.seed(42)
) cada vez que quiera reproducir esa muestra específica.sample.int
sería un poco más rápido, creo:library(microbenchmark);microbenchmark( sample( 10000, 100 ), sample.int( 10000, 100 ), times = 10000 )
La respuesta que da John Colby es la respuesta correcta. Sin embargo, si usted es un
dplyr
usuario, también existe la respuestasample_n
:Muestra aleatoriamente 10 filas del marco de datos. Llama
sample.int
, por lo que realmente es la misma respuesta con menos tipeo (y simplifica el uso en el contexto de magrittr ya que el marco de datos es el primer argumento).fuente
Escribe uno! Ajustar la respuesta de JC me da:
Ahora hazlo mejor comprobando primero si n <= nrow (df) y deteniéndote con un error.
fuente
El
data.table
paquete proporciona la funciónDT[sample(.N, M)]
, muestreando M filas al azar de la tabla de datosDT
.fuente
Solo por completo:
dplyr también ofrece dibujar una proporción o fracción de la muestra por
Esto es muy conveniente, por ejemplo, en el aprendizaje automático cuando tiene que hacer una cierta proporción dividida como 80%: 20%
fuente
EDITAR : Esta respuesta ahora está desactualizada, vea la versión actualizada .
En mi paquete R he mejorado
sample
para que ahora se comporte como se esperaba también para los marcos de datos:Esto es logra haciendo
sample
un método genérico S3 y proporcionando la funcionalidad necesaria (trivial) en una función. Una llamada parasetMethod
arreglar todo. Todavía se puede acceder a la implementación original a través debase::sample
.fuente
sample.default(df, ...)
a un marco de datosdf
, toma muestras de las columnas del marco de datos, ya que un marco de datos se implementa como una lista de vectores de la misma longitud.install_github('kimisc', 'krlmlr')
y conseguíError: Does not appear to be an R package (no DESCRIPTION)
. ¿Alguna forma de evitar eso?[
operador para marcos de datos es un contraejemplo. Además, por favor dígame: ¿Alguna vez, solo una vez, usósample
muestras de columnas de un marco de datos?iris[2]
funciona como una lista, como lo haceiris[[2]]
. Oiris$Species
,lapply(iris, mean)
... Los marcos de datos son listas. Así que espero que se comporten como ellos. Y sí, en realidad he usado sample (myDataframe). En un conjunto de datos donde cada variable contiene datos de expresión de un solo gen. Su método específico ayuda a los usuarios novatos, pero también cambia efectivamente la forma en que sesample()
comporta. Tenga en cuenta que uso "como se esperaba" desde la vista de un programador. Lo cual es diferente de la intuición general. Hay muchas cosas en R que no son compatibles con la intuición general ...;)En mi paquete R hay una función
sample.rows
solo para este propósito:Mejorar
sample
al convertirlo en una función genérica S3 fue una mala idea, según los comentarios de Joris Meys a una respuesta anterior .fuente
Seleccione una muestra aleatoria de un tipo tibble en R:
nrow toma un tibble y devuelve el número de filas. El primer parámetro pasado a
sample
es un rango de 1 al final de su tibble. El segundo parámetro pasado a la muestra, 150, es cuántos muestreos aleatorios desea. El corte de corchetes especifica las filas de los índices devueltos. La variable 'a' obtiene el valor del muestreo aleatorio.fuente
Podrías hacer esto:
Arriba acabo de hacer un marco de datos con 10 columnas y 100 filas, ¿de acuerdo?
Ahora puede probarlo con
sample_n
:fuente
Soy nuevo en R, pero estaba usando este método fácil que funciona para mí:
PD: Siéntete libre de notar si tiene algún inconveniente en el que no estoy pensando.
fuente
Podrías hacer esto:
fuente