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