Mostrando entradas con la etiqueta iris. Mostrar todas las entradas
Mostrando entradas con la etiqueta iris. Mostrar todas las entradas

2021-03-01

How to draw a stratified sample in R

Problem

We want to draw a stratified sample from a data frame in R.

Solution

Let's look at two examples, with one or several groups.

One group

We extract 3 records from each of the species: setosa, versicolor y virginica.

  • Base package
  • set.seed(1)
    iris1 <- lapply(split(iris, iris$Species), function(x) x[sample(nrow(x), 3), ])
    do.call("rbind", iris1) 
    
                  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    setosa.14              4.3         3.0          1.1         0.1     setosa
    setosa.19              5.7         3.8          1.7         0.3     setosa
    setosa.28              5.2         3.5          1.5         0.2     setosa
    versicolor.96          5.7         3.0          4.2         1.2 versicolor
    versicolor.60          5.2         2.7          3.9         1.4 versicolor
    versicolor.94          5.0         2.3          3.3         1.0 versicolor
    virginica.148          6.5         3.0          5.2         2.0  virginica
    virginica.133          6.4         2.8          5.6         2.2  virginica
    virginica.131          7.4         2.8          6.1         1.9  virginica
    
  • dplyr
  • library(dplyr)
    set.seed(1)
    iris %>%
      group_by(Species) %>%
      sample_n(., 3)
    
     Source: local data frame [9 x 5]
    Groups: Species
    
      Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    1          4.3         3.0          1.1         0.1     setosa
    2          5.7         3.8          1.7         0.3     setosa
    3          5.2         3.5          1.5         0.2     setosa
    4          5.7         3.0          4.2         1.2 versicolor
    5          5.2         2.7          3.9         1.4 versicolor
    6          5.0         2.3          3.3         1.0 versicolor
    7          6.5         3.0          5.2         2.0  virginica
    8          6.4         2.8          5.6         2.2  virginica
    9          7.4         2.8          6.1         1.9  virginica
    
    Two groups

    For each number of cylinders (4, 6 u 8) we will extract 2 records with automatic transmission (am = 0) and 2 with manual transmission (am = 1).

  • Base package
  • set.seed(1)
    mtcars1 <- lapply(split(mtcars, list(mtcars$cyl, mtcars$am)), function(x) x[sample(nrow(x), 2), ])
    do.call("rbind", mtcars1) 
    
                           mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    0.4.Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    0.4.Toyota Corona     21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
    1.4.Fiat X1-9         27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    1.4.Lotus Europa      30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    0.6.Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    0.6.Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    1.6.Ferrari Dino      19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    1.6.Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    0.8.Chrysler Imperial 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
    0.8.Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    1.8.Ford Pantera L    15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    1.8.Maserati Bora     15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    
  • dplyr
  • set.seed(1)
    mtcars %>%
      group_by(cyl, am) %>%
      sample_n(., 2)
    
    Source: local data frame [12 x 11]
    Groups: cyl, am
    
        mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    1  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    2  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
    3  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    4  30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    5  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    6  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    7  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    8  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    9  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
    10 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    11 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    12 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    

    Related posts

    References

    2020-11-24

    How to select all columns in dplyr

    Title

    Problem

    We want to select all variables in a data frame using dplyr.

    Solution

    select(iris, everything())
    # Using the pipe operator %>%
    iris %>% select(everything())
    

    Notes

    The function select( ) subsets columns based on their names and other features. We can use the function everything( ) a selection helper to select all variables.

    Results

    Source: local data frame [150 x 5]
    
       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
    7           4.6         3.4          1.4         0.3  setosa
    8           5.0         3.4          1.5         0.2  setosa
    9           4.4         2.9          1.4         0.2  setosa
    10          4.9         3.1          1.5         0.1  setosa
    ..          ...         ...          ...         ...     ...
    

    References

    2019-01-10

    Loops with ggplot2

    Problem

    We want to create a loop and save plots for each subset of data using ggplot2. Instead of plotting on the same panel using facet_wrap o facet_grid, we'd like to display and save eachplot separately.

    library(tidyverse)
    p <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point()
    p + facet_wrap(vars(Species), scales = "free")
    

    Solution

    We create an empty list to store all plots. Then, we start a loop for each unique element of the variable (column) Species. To keep the same title format, we leave the function facet_wrap.

    # Loop
    plots <- list() # Empty list
    p_list <- unique(iris$Species)
    for (i in seq_along(p_list)) {
      # Plot for each Species
      p <- iris %>% filter(Species == p_list[i]) %>%
        ggplot(aes(Sepal.Length, Sepal.Width)) +
        geom_point() +
        facet_wrap( ~ Species) # Títulos
      plots[[i]] = p
      print(p)
    }
    
    To print the whole plot list or a specific element:

    # Print list
    print(plots)
    # Print an element of the list
    print(plots[[1]])
    

    Related posts

    References

    2019-01-09

    Usar bucles en ggplot2

    Problema

    Queremos crear y guardar gráficos separadamente con ggplot2. Es decir, en lugar de mostrar los gráficos en un mismo panel con facet_wrap o facet_grid, queremos crear gráficos independientes, cada uno en un panel y almacenarlos en una lista.

    library(tidyverse)
    p <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point()
    p + facet_wrap(vars(Species), scales = "free")
    

    Solución

    Creamos una lista vacía donde almacenaremos los gráficos. Iniciamos un bucle generando uno gráfico con ggplot2 para cada elemento único de la lista de especies. Dejamos la función facet_wrap, aunque cada gráfico está en un único panel, para obtener el título de cada especie.

    # Bucle
    plots <- list() # Creamos una lista vacía
    p_list <- unique(iris$Species)
    for (i in seq_along(p_list)) {
      # Gráfico por especie
      p <- iris %>% filter(Species == p_list[i]) %>%
        ggplot(aes(Sepal.Length, Sepal.Width)) +
        geom_point() +
        facet_wrap( ~ Species) # Títulos
      plots[[i]] = p
      print(p)
    }
    
    Para volver a imprimir la lista completa de gráficos o uno específico.

    # Imprime lista completa
    print(plots)
    # Imprime uno específico
    print(plots[[1]])
    

    Entradas relacionadas

    Referencias

    2017-02-06

    Dividir y guardar como ficheros subconjuntos de un data frame con R


    Problema

    Queremos guardar cada subconjunto de un data frame como un fichero de texto en el directorio de trabajo. En este ejemplo, utilizamos el conjunto de datos iris y crearemos un fichero CSV por cada una de las especies de la columna Species: setosa, versicolor, y virginica.

    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
    
    

    Solución

    Utilizamos el siguiente bucle para filtrar el data frame y creas los ficheros.

    for (name in levels(iris$Species)) {
      # Filtramos el data frame y seleccionamos las columnas
      tmp <- subset(iris, select = -Species, Species == name)
      # Crea un nuevo fichero por cada especie
      fn <- paste(gsub(" ", "", name), ".csv", sep = "")
      # Por cada especie, guarda un CSV en el directorio de trabajo
      write.csv(tmp, fn, row.names = FALSE)
    } 

    Resultado

    En el directorio de trabajo, se habrán guardo los ficheros correspondientes.

    2015-08-30

    ¿Cómo seleccionar todas las columnas de un data frame con dplyr?

    Title

    Problema

    Queremos seleccionar todas las columnas de un data frame con el paquete dplyr.

    Respondemos a una duda planteada en stackoverflow. Otra cuestión sería por qué razón querríamos hacer algo así en lugar simplemente utilizar todo el data frame tecleando su nombre.

    Soluciones

    select(iris, everything())
    # Usando el operador %>%
    iris %>% select(everything())
    
    rename(iris)
    

    Notas

    select( ) selecciona solamente aquellas variables que indiquemos; rename( ) selecciona todas las variables. Si empleamos select, introducimos everything( ) que es una de las funciones especiales que solamente funcionan dentro de select.

    Resultado

    Source: local data frame [150 x 5]
    
       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
    7           4.6         3.4          1.4         0.3  setosa
    8           5.0         3.4          1.5         0.2  setosa
    9           4.4         2.9          1.4         0.2  setosa
    10          4.9         3.1          1.5         0.1  setosa
    ..          ...         ...          ...         ...     ...
    

    Referencias

    2015-07-05

    Muestra aleatoria de filas por grupos en R

    Title

    Problema

    Deseamos extraer una muestra aleatoria de filas por grupos de un data frame en R.

    Solución

    Veremos dos ejemplos: con un grupo o varios (dos para simplificar).

    Un grupo

    Extraemos 3 registros de cada una de las especias: setosa, versicolor y virginica.

  • Paquete base
  • set.seed(1)
    iris1 <- lapply(split(iris, iris$Species), function(x) x[sample(nrow(x), 3), ])
    do.call("rbind", iris1) 
    
                  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    setosa.14              4.3         3.0          1.1         0.1     setosa
    setosa.19              5.7         3.8          1.7         0.3     setosa
    setosa.28              5.2         3.5          1.5         0.2     setosa
    versicolor.96          5.7         3.0          4.2         1.2 versicolor
    versicolor.60          5.2         2.7          3.9         1.4 versicolor
    versicolor.94          5.0         2.3          3.3         1.0 versicolor
    virginica.148          6.5         3.0          5.2         2.0  virginica
    virginica.133          6.4         2.8          5.6         2.2  virginica
    virginica.131          7.4         2.8          6.1         1.9  virginica
    
  • Paquete dplyr
  • library(dplyr)
    set.seed(1)
    iris %>%
      group_by(Species) %>%
      sample_n(., 3)
    
     Source: local data frame [9 x 5]
    Groups: Species
    
      Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    1          4.3         3.0          1.1         0.1     setosa
    2          5.7         3.8          1.7         0.3     setosa
    3          5.2         3.5          1.5         0.2     setosa
    4          5.7         3.0          4.2         1.2 versicolor
    5          5.2         2.7          3.9         1.4 versicolor
    6          5.0         2.3          3.3         1.0 versicolor
    7          6.5         3.0          5.2         2.0  virginica
    8          6.4         2.8          5.6         2.2  virginica
    9          7.4         2.8          6.1         1.9  virginica
    
    Dos grupos

    Por cada número de cilindros de los coches (4, 6 u 8) extraemos dos con transmisión automática = 0 y dos con transmisión manual = 1.

  • Paquete base
  • set.seed(1)
    mtcars1 <- lapply(split(mtcars, list(mtcars$cyl, mtcars$am)), function(x) x[sample(nrow(x), 2), ])
    do.call("rbind", mtcars1) 
    
                           mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    0.4.Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    0.4.Toyota Corona     21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
    1.4.Fiat X1-9         27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    1.4.Lotus Europa      30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    0.6.Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    0.6.Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    1.6.Ferrari Dino      19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    1.6.Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    0.8.Chrysler Imperial 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
    0.8.Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    1.8.Ford Pantera L    15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    1.8.Maserati Bora     15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    
  • Paquete dplyr
  • set.seed(1)
    mtcars %>%
      group_by(cyl, am) %>%
      sample_n(., 2)
    
    Source: local data frame [12 x 11]
    Groups: cyl, am
    
        mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    1  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    2  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
    3  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    4  30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    5  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    6  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    7  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    8  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    9  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
    10 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    11 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    12 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    

    Entradas relacionadas

    Nube de datos