studio seleccionar muestras generar filtrar filas eliminar datos data contar columnas aleatorias r random

seleccionar - Extracción de una muestra aleatoria de filas en un data.frame con un condicional anidado



seleccionar columnas en r (4)

Con dplyr:

library(dplyr) set.seed(12) filter(iris, Species != "setosa") %>% sample_n(., 2)

Salida:

Sepal.Length Sepal.Width Petal.Length Petal.Width Species 7 6.3 3.3 4.7 1.6 versicolor 81 7.4 2.8 6.1 1.9 virginica

Esta pregunta se crea a partir de la publicación de SO que se encuentra aquí y utiliza un código modificado a partir de una publicación en la lista de correo de ayuda de R que se puede ver aquí.

Estoy tratando de extraer una muestra aleatoria de filas en un marco de datos pero con un condicional. Usando los datos del iris R que se ve así:

> head(iris) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa

Para tomar una muestra aleatoria simple, el código siguiente funciona bien para tomar una muestra de 2 filas.

iris[sample(nrow(iris), 2), ]

Sin embargo, no estoy seguro de cómo acondicionar el campo Especies. Por ejemplo, cómo tomar la muestra aleatoria como se indicó anteriormente, pero solo cuando Species != “setosa”

Hay tres categorías de iris$Species

> summary(iris$Species) setosa versicolor virginica 50 50 50

No estoy seguro de cómo anidar correctamente condicionales. Uno de mis intentos anteriores está debajo con los resultados obviamente incorrectos incluidos ...

> iris[sample(nrow(iris)[iris$Species != "setosa"], 2), ] Sepal.Length Sepal.Width Petal.Length Petal.Width Species NA NA NA NA NA <NA> NA.1 NA NA NA NA <NA>

Gracias


Enfoque de tabla de datos limpio y simple:

require(data.table) iris <- data.table(iris) cond <- iris[Species!= ''setosa'', which = T] iris[sample(cond, 2)]


Sería más limpio no hacerlo en una línea, pero

iris[iris$Species != "setosa",][sample(nrow(iris[iris$Species != "setosa",]), 2), ]


Yo usaría which para obtener el vector de números de filas a partir de los cuales puedes sample dada tu condición ...

iris[ sample( which( iris$Species != "setosa" ) , 2 ) , ] # Sepal.Length Sepal.Width Petal.Length Petal.Width Species #59 6.6 2.9 4.6 1.3 versicolor #133 6.4 2.8 5.6 2.2 virginica