Mostrando entradas con la etiqueta Muestra aleatoria. Mostrar todas las entradas
Mostrando entradas con la etiqueta Muestra aleatoria. Mostrar todas las entradas

2016-05-11

Muestra aleatoria basada en una columna en R

Title

Problema

Queremos extraer del siguiente data frame una muestra aleatoria basada en la columna id, de manera que seleccionemos aleatoriamente dos ids y extraigamos todas las filas asociadas a los mismos. Por ejemplo, si seleccionamos aleatoriamente los ids 1 y 2, el resultado debería incluir las tres primeras filas.

  id     date      date2
1  1 23-01-08 2008-01-23
2  1 01-11-07 2007-11-01
3  2 30-11-07 2007-11-30
4  3 17-12-07 2007-12-17
5  3 12-12-08 2008-12-12
id<-c(1,1,2,3,3)
date<-c("23-01-08","01-11-07","30-11-07","17-12-07","12-12-08")
df<-data.frame(id,date)
df$date2<-as.Date(as.character(df$date), format = "%d-%m-%y")

Soluciones

  • Paquete base
  • a <- sample(unique(df$id), 2)
    subset(df, id %in% a)
    
  • sqldf
  • library(sqldf)
    a <- sqldf("SELECT DISTINCT id FROM df  ORDER BY RANDOM(*) LIMIT 2")
    sqldf("SELECT * FROM df WHERE id IN a")
    
      id     date      date2
    1  1 23-01-08 2008-01-23
    2  1 01-11-07 2007-11-01
    3  2 30-11-07 2007-11-30
    

    Entradas relacionadas

    Referencias

    2015-07-27

    Dividir aleatoriamente los datos en dos partes con R

    Title

    Problema

    Deseamos dividir aleatoriamente nuestros datos en dos partes. Será por ejemplo necesario para evaluar modelos estadísticos o de machine learning, y necesitemos construir dos conjuntos de datos, uno de entrenamiento o prueba del modelo (training) y otro de prueba independiente del mismo (test),

    Solución

    Utilizamos el siguiente código con el data frame mtcars.

    set.seed(1234)
    ind <- sample(2, nrow(mtcars), replace = TRUE, prob = c(0.7, 0.3))
    data1 <- mtcars[ind == 1, ]
    data2 <- mtcars[ind == 2, ] 
    
    Generamos un índice de unos y doses para el número de filas de nuestro conjunto de datos —nrow— con las probabilidades deseadas, en nuestro ejemplo un 70% y un 30%. Con ese índice creamos los dos subconjuntos: data1 y data2.

    # Primera parte
    data1
    
                       mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4          21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
    Mazda RX4 Wag      21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    Datsun 710         22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
    Hornet 4 Drive     21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    Valiant            18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
    Duster 360         14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
    Merc 240D          24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    Merc 230           22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
    Merc 280           19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    Merc 280C          17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
    Merc 450SE         16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
    Merc 450SL         17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
    Cadillac Fleetwood 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
    Chrysler Imperial  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
    Fiat 128           32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
    Honda Civic        30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
    Toyota Corolla     33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
    Toyota Corona      21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
    Dodge Challenger   15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
    AMC Javelin        15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
    Camaro Z28         13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
    Pontiac Firebird   19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
    Porsche 914-2      26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
    Ferrari Dino       19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    Maserati Bora      15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    Volvo 142E         21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
    
    # Segunda parte
    data2
    
                         mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
    Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
    Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    

    Entradas relacionadas

    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

    2015-04-20

    Muestra aleatoria de filas de un data frame en R

    Title

    Problema

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

    Solución

    Emplearemos los datos incluidos en el paquete hflights. Es un data frame de 227.496 filas y 21 columnas que contiene información sobre los vuelos que parten de los aeropuertos de Houston: IAH (George Bush Intercontinental) y HOU (Houston Hobby).

    require(hflights)
    head(hflights)
    
    • Paquete base
    set.seed(1)
    hflights[sample(nrow(hflights), 10), ] # 10 filas
    # Mostramos solamente 5 columnas:
    hflights[sample(nrow(hflights), 10), 1:5]
    
            Year Month DayofMonth DayOfWeek DepTime
    1366969 2011     3         14         1    1825
    1040415 2011     3         12         6    1745
    4202032 2011     9         18         7     915
    2209673 2011     5         16         1    1521
    4693709 2011    10         15         6    1350
    3107473 2011     7         23         6    1644
    4323034 2011     9         28         3    1739
    5987852 2011    12         17         6     800
    2206152 2011     5         18         3     736
    4699698 2011    10          6         4     748
    
    • dplyr
    hflights %>% 
      sample_n(10) %>% 
      select(1:5)
    
    • sqldf
    require(sqldf)
    sqldf("SELECT * FROM hflights ORDER BY RANDOM(*) LIMIT 10")
    
    La desventaja con sqldf es que no podemos generar números pseudoaletorios con set.seed para obtener los mismos resultados y que sean reproducibles pues la función RANDOM de SQLITE no lo permite.

    Entradas relacionadas

    Nube de datos