2017-12-31

Importar datos desde una URL en R

Problema

¿Cómo podemos importar datos desde una URL en R? Tenemos una URL en la que hay un fichero de texto y queremos importarlo en R sin necesidad de descargarlo antes de importarlo.

Si accedemos a esta dirección, nos aparecerá una ventana emergente indicándonos si queremosa abrirlo o guardarlo.

http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv

Solución

Simplemente indicamos a la función correspondiente, la ruta URL. Además del paquete base, muestro dos ejemplos con dos paquetes muy populares: data.table y readr.

  • Base
  • ad <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
    head(ad)
    
      X    TV radio newspaper sales
    1 1 230.1  37.8      69.2  22.1
    2 2  44.5  39.3      45.1  10.4
    3 3  17.2  45.9      69.3   9.3
    4 4 151.5  41.3      58.5  18.5
    5 5 180.8  10.8      58.4  12.9
    6 6   8.7  48.9      75.0   7.2
    
  • data.table
  • library(data.table)
    ad <- fread("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
    head(ad)
    
    V1    TV radio newspaper sales
    1:  1 230.1  37.8      69.2  22.1
    2:  2  44.5  39.3      45.1  10.4
    3:  3  17.2  45.9      69.3   9.3
    4:  4 151.5  41.3      58.5  18.5
    5:  5 180.8  10.8      58.4  12.9
    6:  6   8.7  48.9      75.0   7.2
    
  • readr
  • library(readr)
    ad <- read_csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
    head(ad)
    
    # A tibble: 6 x 5
         X1    TV radio newspaper sales
              
    1     1 230.1  37.8      69.2  22.1
    2     2  44.5  39.3      45.1  10.4
    3     3  17.2  45.9      69.3   9.3
    4     4 151.5  41.3      58.5  18.5
    5     5 180.8  10.8      58.4  12.9
    6     6   8.7  48.9      75.0   7.2
    

Referencias

2017-12-24

Google Trends en R con gtrendsR

Title

Problema

Deseamos importar y representar gráficamente en R datos de Google Trends. Como el siguiente ejempo en el que mostramos el interés en el tiempo de estos 3 términos de búsqueda.

Solución

Empleamos el paquete gtrendsR. Básicamente consiste de una función, gtrends, que extrae la información de Google Trends.

library("gtrendsR")
palabras_clave <- c("Pho", "Ramen", "Soba")
tendencias <- gtrends(palabras_clave, time = "all")
plot(tendencias)
  • Especificando la categoría y usando ggplot2
  • Abajo, en la sección notas, más información sobre los argumentos.

    id <- categories[grepl("^Cooking", categories$name), ]
    tendencias_gg <- gtrends(palabras_clave, 
                             time = "all", 
                             category = as.numeric(id[, 2]))
    
    library(ggplot2)
    tendencias_gg <- tendencias_gg$interest_over_time
    ggplot(data = tendencias_gg) + geom_line(aes(x = date, y = hits, colour = keyword), size =1)+
      scale_x_date(date_breaks = "1 year", date_labels = "%Y")+
      theme_bw() 
    

    Notas

    Los principales argumentos de gtrends son:

    keyword - Las palabras clave que queremos consulta, con un máximo de 5 cada vez.
    geo - Un vector con los country_codes de los países para la consulta. Por defecto es en todo el mundo (worldwide).
    time - Una cadena de texto con el periodo de tiempo deseado. Por defecto los últimos 5 años.
    gprop - Producto de Google: web (por defecto), noticias (news), imágenes (imágenes), froogle, y youtube.
    category - El id de la categoría a consultar.

    Para consultar los countries_codes y los ids de la categoría.

    data("countries")
    head(countries)
    
     country_code           description sub_code
    1           AD              .ANDORRA         
    2           AD                 Escas    AD-04
    3           AE .UNITED ARAB EMIRATES         
    4           AE             Abu Dhabi    AE-AZ
    5           AE Ahmed Bin Rashid Port    AE-AZ
    6           AE           Al Fujayrah    AE-FU
    
    data("categories")
    head(categories)
    
                                  name   id
    1                   All categories    0
    3             Arts & Entertainment    3
    5 Celebrities & Entertainment News  184
    6               Comics & Animation  316
    8                   Animated Films 1104
    9                    Anime & Manga  317
    
    gtrends crea una lista de 6 data frames:

    names(tendencias)
    
    [1] "interest_over_time" "interest_by_region" "interest_by_dma"   
    [4] "interest_by_city"   "related_topics"     "related_queries"
    
    La función plot representa gráficamente el data frame interest_over_time.

    Referencias

    2017-12-14

    Renombrar columnas duplicadas al unir dos tablas con dplyr

    Title

    Problema

    Cuando unimos dos tablas con dplyr, las columnas duplicadas de la primera tabla recibirán por defecto el sufijo .x y las de la segunda tabla el sufijo .y. En el siguiente ejemplo, las columnas mpg.x y mpg.y. ¿Cómo podemos modificar esos sufijos?

    library("dplyr") 
    left_join(mtcars, mtcars[, c("mpg", 'cyl')], by = c("cyl")) %>% head()
    
      mpg.x cyl disp  hp drat   wt  qsec vs am gear carb mpg.y
    1    21   6  160 110  3.9 2.62 16.46  0  1    4    4  21.0
    2    21   6  160 110  3.9 2.62 16.46  0  1    4    4  21.0
    3    21   6  160 110  3.9 2.62 16.46  0  1    4    4  21.4
    4    21   6  160 110  3.9 2.62 16.46  0  1    4    4  18.1
    5    21   6  160 110  3.9 2.62 16.46  0  1    4    4  19.2
    6    21   6  160 110  3.9 2.62 16.46  0  1    4    4  17.8
    

    Solución

    Empleamos el argumento suffix, suministrando un vector de longitud 2 para las dos tablas unidas. En nuestro ejemplo, nombramos las columnas mpg_original (sufijo _original) y mpg_new (sufijo _new).

    left_join(mtcars, mtcars[,c("mpg","cyl")], 
                  by = c("cyl"), 
                  suffix = c("_original", "_new")) %>% head()
    
  • Datos
  • mpg_original cyl disp  hp drat   wt  qsec vs am gear carb mpg_new
    1           21   6  160 110  3.9 2.62 16.46  0  1    4    4    21.0
    2           21   6  160 110  3.9 2.62 16.46  0  1    4    4    21.0
    3           21   6  160 110  3.9 2.62 16.46  0  1    4    4    21.4
    4           21   6  160 110  3.9 2.62 16.46  0  1    4    4    18.1
    5           21   6  160 110  3.9 2.62 16.46  0  1    4    4    19.2
    6           21   6  160 110  3.9 2.62 16.46  0  1    4    4    17.8
    

    Referencias

    2017-12-12

    Abrir ficheros de texto en Excel arrastrándolos y soltándolos

    Title

    Problema

    Deseamos abrir rápidamente un fichero de texto (csv o txt), sin necesidad de importarlo desde la pestaña de Datos.

    Solución

    Simplemente arrastramos el fichero y lo soltamos sobre cualquier fichero Excel abierto o el icono de Excel en la barra de tareas. Excel creará automáticamente otro libro temporal con el contenido del fichero de texto.

    Si la extensión del fichero está vinculada a Excel también podemos hacer doble clic sobre el mismo. También si no está vinculado podremos elegir Excel en Abrir con, si lo hemos hecho anteriormente.

    Entradas relacionadas

    2017-12-10

    Ampliar el número de libros recientes mostrados en Excel

    Title

    Problema

    Libros recientes en Excel lista por defecto los últimos 25 libros abiertos con Excel. Para acceder al listado, abrimos Excel y hacemos clic an Abrir otro Libros; o bien desde cualquier libro, clic en la Archivo y seleccionamos Abrir. ¿Qué debemos hacer si queremos modificar el número de libros recientes listados?

    Solución

    Inicio, Opciones de Excel, Avanzadas y descendemos hasta la sección Mostrar, donde seleccionaremos el número deseado (50 como máxismo).

    Entradas relacionadas

    2017-11-26

    Diagrama de barras en ggplot - Preservar orden del data frame

    Title

    Problema

    Cuando creamos un diagrama de barras, ggplot2 ordena por defecto el eje x alfabéticamente, de manera que en el gráfico aparecen desordenadas las categorías.

    library("ggplot2") 
    ggplot(df, aes(x = palabra, y= contar, fill = categoria)) + geom_bar(stat = "identity")
    
  • Datos
  •  palabras contar categoria palabra
    1       BI  67452    Defect      BI
    2       Bu  47279    Defect      Bu
    3       Re  38530    Defect      Re
    4      dvd   2554    Defect     dvd
    5    Techn  34044  Digitaal   Techn
    6   Retour  12190  Digitaal  Retour
    7  Digital  22102  Digitaal Digital
    8     Kobo   1234  Digitaal    Kobo
    
    # Data frame
    df <- structure(list(palabras = structure(c(1L, 2L, 6L, 4L, 8L, 7L, 
    3L, 5L), .Label = c("BI", "Bu", "Digital", "dvd", "Kobo", "Re", 
    "Retour", "Techn"), class = "factor"), contar = c(67452, 47279, 
    38530, 2554, 34044, 12190, 22102, 1234), categoria = structure(c(1L, 
    1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Defect", "Digitaal"), class = "factor")), .Names = c("palabras", 
    "contar", "categoria"), row.names = c(NA, -8L), class = "data.frame")
    

    Solución

    Ordenamos el factor palabra conforme al orden en el que aparecen en el data frame.

    df$palabra <- factor(df$palabra, levels = df$palabra)
    ggplot(df, aes(x = palabra, y= contar, fill = categoria)) + geom_bar(stat = "identity")
    

    Referencias

    2017-11-16

    Cambiar el color y añadir leyenda en un diagrama de barras por subgrupos en ggplot2

    Title

    Problema

    Cuando creamos un diagrama de barras por subgrupos (facet_grid), aunque especifiquemos color para el eje x, ggplot2 crea un gráfico monocromático, sin cambiar el color de cada columna.

    library("ggplot2")    
    ggplot(data = diamonds) + 
          geom_bar(mapping = aes(x = color, y = ..prop.., group = 2)) + 
          scale_y_continuous(labels=scales::percent) +
          facet_grid(~cut)
    

    Solución

    Al calcular la proporción por grupo, necesitamos especificar en una aesthetics (aes) diferente el color para alterar el comportamiento por defecto de ggplot2. Una dentro de la función ggplot y otra dentro de geom_bar con fill.

    ggplot(data = diamonds, aes(x = color, y = ..prop.., group = cut)) + 
      geom_bar(aes(fill = factor(..x.., labels = LETTERS[seq(from = 4, to = 10 )]))) + 
      labs(fill = "color") + 
      scale_y_continuous(labels = scales::percent) + 
      facet_grid(~ cut)
    

    Referencias

    Nube de datos