Mostrando entradas con la etiqueta R para Principiantes. Mostrar todas las entradas
Mostrando entradas con la etiqueta R para Principiantes. Mostrar todas las entradas

2018-12-10

Listar conjuntos de datos disponibles en R

Problema

Queremos conocer los conjuntos de datos disponibles en R, tanto cargados en un determinado momento como los de todos paquetes disponibles.

Solución

  1. Listar los conjuntos de datos disponibles en ese momento
  2. data()
    
    Data sets in package ‘datasets’:
    
    AirPassengers           Monthly Airline Passenger Numbers 1949-1960
    BJsales                 Sales Data with Leading Indicator
    BJsales.lead (BJsales)
                            Sales Data with Leading Indicator
    BOD                     Biochemical Oxygen Demand
    CO2                     Carbon Dioxide Uptake in Grass Plants
    ChickWeight             Weight versus age of chicks on different diets
    DNase                   Elisa assay of DNase
    EuStockMarkets          Daily Closing Prices of Major European Stock
                            Indices, 1991-1998
    Formaldehyde            Determination of Formaldehyde
    HairEyeColor            Hair and Eye Color of Statistics Students
    ...                    ...
    
  3. Listar los conjuntos de datos de todos los paquetes disponibles
  4. data(package = .packages(all.available = TRUE))
    
    Data sets in package ‘aqp’:
    
    amarillo                Amarillo Soils
    ca630                   Soil Data from the Central Sierra Nevada Region
                            of California
    munsell                 Munsell to sRGB Lookup Table for Common Soil
                            Colors
    rruff.sample            Sample XRD Patterns
    soil_minerals           Munsell Colors of Common Soil Minerals
    sp1                     Soil Profile Data Example 1
    sp2                     Honcut Creek Soil Profile Data
    sp3                     Soil Profile Data Example 3
    sp4                     Soil Chemical Data from Serpentinitic Soils of
                            California
    sp5                     Sample Soil Database #5
    sp6                     Soil Physical and Chemical Data from
                            Manganiferous Soils
    
    Data sets in package ‘beeswarm’:
    
    breast                  Lymph-node-negative primary breast tumors
    
  5. Listar los conjuntos de datos de un paquete específico
  6. data(package = "ISLR")
    
    Data sets in package ‘ISLR’:
    
    Auto                    Auto Data Set
    Caravan                 The Insurance Company (TIC) Benchmark
    Carseats                Sales of Child Car Seats
    College                 U.S. News and World Report's College Data
    Credit                  Credit Card Balance Data
    Default                 Credit Card Default Data
    Hitters                 Baseball Data
    Khan                    Khan Gene Data
    NCI60                   NCI 60 Data
    OJ                      Orange Juice Data
    Portfolio               Portfolio Data
    Smarket                 S&P Stock Market Data
    Wage                    Mid-Atlantic Wage Data
    Weekly                  Weekly S&P Stock Market Data
    

Referencias

2018-10-14

Importar ficheros comprimidos en R con readr

Problema

Queremos importar ficheros comprimidos en R.

Solución

Empleamos el paquete readr que descomprime automáticamente los siguientes tipos de ficheros: gz, .bz2, .xz, o .zip. Podemos emplearlo con la read_delim o los casos especiales read_csv, read_csv2 o read_tsv. En nuestro ejemplo utilizamos el fichero title.ratings.tsv.gz.

library(readr)
df_ratings <- read_tsv('title.ratings.tsv.gz', na = "\\N", quote = '')
df_ratings %>% head()
También podemos indicar la dirección del fichero y automáticamente descargará y descomprimirá el mismo.

df_ratings <- read_tsv('https://datasets.imdbws.com/title.ratings.tsv.gz', na = "\\N", quote = '')
df_ratings %>% head()

Resultados

# A tibble: 6 x 3
  tconst    averageRating numVotes
                   
1 tt0000001           5.8     1423
2 tt0000002           6.4      168
3 tt0000003           6.6     1016
4 tt0000004           6.4      100
5 tt0000005           6.2     1713
6 tt0000006           5.5       88

Entradas relacionadas

Referencias

2016-09-05

Convertir el tipo de objeto de todas las columnas de un data frame

Title

Problema

En R podemos usar las siguientes funciones para convertir el tipo de objeto de un vector a otro:

as.character(x)
as.complex(x)
as.numeric(x) or as.double(x)
as.integer(x)
as.logical(x)

Pero si deseamos convertir todas las columnas de un data frame, ¿qué podemos hacer?.

Solución

Tomamos como ejemplo el data frame mtcars al que le asignaremos el nombre df.

df <- mtcars
str(df)

'data.frame': 32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
  • Opción 1
  • df <- data.frame(lapply(df, as.character), stringsAsFactors = FALSE)
    
  • Opción 2
  • Más conicsa.

    df[] <- lapply(df, as.character)
    

Resultado

Ahora todas las columnas son del tipo carácter.

str(df)

'data.frame': 32 obs. of  11 variables:
 $ mpg : chr  "21" "21" "22.8" "21.4" ...
 $ cyl : chr  "6" "6" "4" "6" ...
 $ disp: chr  "160" "160" "108" "258" ...
 $ hp  : chr  "110" "110" "93" "110" ...
 $ drat: chr  "3.9" "3.9" "3.85" "3.08" ...
 $ wt  : chr  "2.62" "2.875" "2.32" "3.215" ...
 $ qsec: chr  "16.46" "17.02" "18.61" "19.44" ...
 $ vs  : chr  "0" "0" "1" "1" ...
 $ am  : chr  "1" "1" "1" "0" ...
 $ gear: chr  "4" "4" "4" "3" ...
 $ carb: chr  "4" "4" "1" "1" ...

Referencias

2015-11-05

Descartar variables de un data frame por su nombre

Title

Problema

Deseamos excluir variables de un data frame de acuerdo a su nombre. En nuestro ejemplo usamos el data frame iris, y queremos descartar las variables Sepal.Length y Petal.Width.

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

Soluciones

Hay múltiples opciones.

  • Paquete base
  • # Opción 1
    iris[, -which(names(iris) %in% c("Sepal.Length", "Petal.Width"))]
    # Opción 2
    iris[ , !names(iris) %in% c("Sepal.Length","Petal.Width")]
    # Opción 3
    subset(iris, select = -c(Sepal.Length, Petal.Width)) 
    
  • dplyr
  • library(dplyr)
    iris %>% select(-c(Sepal.Length, Petal.Width))
    
  • data.table
  • library(data.table)
    DT = as.data.table(iris)
    DT[ , !names(DT) %in% c("Sepal.Length", "Petal.Width"), with = FALSE]
    # Otra opción
    subset(DT, select=-c(Sepal.Length, Petal.Width)) 
    

    Resultado

    Las tres variables restantes. Solamente mostramos las 6 primeras filas

      Sepal.Width Petal.Length Species
    1         3.5          1.4  setosa
    2         3.0          1.4  setosa
    3         3.2          1.3  setosa
    4         3.1          1.5  setosa
    5         3.6          1.4  setosa
    6         3.9          1.7  setosa
    

    Notas

    Hay diferencias sutiles entre la primera opción con el paquete base -which y la segunda con la función !. Si con -which especificamos nombres que no encuentra en el data frame devolverá un data frame vacío con cero columnas. Mientras que si sucede lo mismo con !, devolverá el data frame original sin modificar.

    La sintaxis con dplyr es bastante sencilla. Con data.table es muy similar a las utilizadas con el paquete base. No obstante, es necesario especificar el argumento with = FALSE o devolverá un vector lógico. También podemos emplear con data.table la función subset.

    Entradas relacionadas

    Referencias

    2015-10-21

    Etiquetar un diagrama de dispersión en ggplot2 basándonos en otra columna

    Title

    Problema

    Deseamos etiquetar solamente aquellos puntos de un diagrama de dispersión que cumplan una condición basada en otra columna de un data frame. En nuestro ejemplo, solamente aquellos puntos de la columna b cuyo valor sea mayor de 0.5

    set.seed(1)
    x <- data.frame(a = 1:10, b = rnorm(10))
    x$lab <- letters[1:10]
    
        a          b lab
    1   1 -0.6264538   a
    2   2  0.1836433   b
    3   3 -0.8356286   c
    4   4  1.5952808   d
    5   5  0.3295078   e
    6   6 -0.8204684   f
    7   7  0.4874291   g
    8   8  0.7383247   h
    9   9  0.5757814   i
    10 10 -0.3053884   j
    

    Solución

  • Opción 1
  • Crear un subconjunto (subset) dentro de la función geom_text.

    ggplot(data = x, aes(a, b, label = lab)) + 
      geom_point() + 
      geom_text(data = subset(x, abs(b) > 0.2), vjust = 1.5)
    

  • Opción 2
  • Asignando NA a aquellos valores que no queremos etiquetar

    x$lab[!(abs(x$b) > 0.5)] <- NA
    ggplot(data = x, aes(a, b, label = lab)) + 
        geom_point() + 
        geom_text(vjust = 1.5) 
    
    Usando qplot:
    qplot(a, b, data = x, label = lab, geom = c('point','text'), vjust = 1.5)
    

    Resultado

    Entradas relacionadas

    Referencias

    2015-10-17

    Substraer a cada valor de una fila la mediana de su respectiva fila en R

    Title

    Problema

    Queremos substraer a cada valor de una fila la mediana de la fila.

    Datos

    Creamos una matriz de 5x10.

    set.seed(24)
    m1 <- matrix(sample(0:9, 10*5, replace=TRUE), ncol=5)
    
          [,1] [,2] [,3] [,4] [,5]
     [1,]    2    6    0    3    4
     [2,]    2    3    5    2    3
     [3,]    7    6    7    3    2
     [4,]    5    6    1    1    2
     [5,]    6    3    2    9    0
     [6,]    9    9    6    2    0
     [7,]    2    1    0    7    3
     [8,]    7    0    5    6    3
     [9,]    8    5    6    6    2
    [10,]    2    1    0    9    3

    Solución

    m1 - apply(m1, 1, median)
    
          [,1] [,2] [,3] [,4] [,5]
     [1,]   -1    3   -3    0    1
     [2,]   -1    0    2   -1    0
     [3,]    1    0    1   -3   -4
     [4,]    3    4   -1   -1    0
     [5,]    3    0   -1    6   -3
     [6,]    3    3    0   -4   -6
     [7,]    0   -1   -2    5    1
     [8,]    2   -5    0    1   -2
     [9,]    2   -1    0    0   -4
    [10,]    0   -1   -2    7    1
    Si queremos conocer la mediana de cada fila.

    apply(m1, 1, median)
    
    [1] 3 3 6 2 3 6 2 5 6 2
    

    Notas

    Empleamos la función apply para aplicar una función a cada fila, en este caso la función median (mediana). En el segundo argumento de la función 1 indica que la función será aplicada sobre las filas (fila a fila). Las funciones apply son muy útiles en R pues evitan el uso de bucles (loops), pudiendo aplicar funciones a los márgenes, filas o columnas, de una matriz.

    Entradas relacionadas

    Referencias

    2015-10-08

    Comparar dos vectores en R: elementos comunes y únicos

    Title

    Problema

    Deseamos comparar dos vectores en R y obtener los elemenos comunes y únicos de ambos.

    Datos

    # Dos vectores
    [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
    [1] "f" "g" "h" "i" "j" "k" "l" "m" "n" "o"
    
    a <- letters[seq(from = 1, to = 10)]
    b < -letters[seq(from = 6, to = 15)]
    

    Soluciones

  • Elementos comunes
  • # Múltiples opciones
    intersect(a, b)
    b[b %in% a]
    a[a %in% b]
    
    [1] "f" "g" "h" "i" "j"
  • Elementos únicos de a
  • setdiff(a, b)
    a[!a %in% b]
    a[b %in% a]
    
    [1] "a" "b" "c" "d" "e"
  • Elementos únicos de b
  • setdiff(b, a)
    b[!b %in% a]
    b[a %in% b]
    
    [1] "k" "l" "m" "n" "o"

    Notas

    Merece la pena señalar que intersect y setdiff descartarán los valores duplicados en los argumentos. Mientras que %in% conservará los duplicados. Por lo que si tuviéramos duplicados en loos vectores obtendríamos diferentes resultados. Por ejemplo, introduciendo un elemento duplicado 'a' en el vector a.

    a <- c(a, "a")
    [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "a"
  • setdiff descarta los duplicados
  • setdiff(a, b)
    [1] "a" "b" "c" "d" "e"
  • El operador "[]" con %in% los conserva
  • a[!a %in% b]
    [1] "a" "b" "c" "d" "e" "a"

    Entradas relacionadas

    Referencias

    Nube de datos