5 Andra paket

Här är en kort introduktion till ett par andra paket som är lätta och roliga att använda.

5.1 leaflet

med leaflet skapar vi enkelt kartor baserade på Google Maps. Observera här att i paketet leaflet finns också en funktion, leaflet(). Vi använder också paketet ggmap för att få hitta koordinater för platser, om vi inte vill gå till Google maps och hitta dem. Observera att du kommer behöva installera vissa paket, använd install.packages("paketets namn")

library(ggmap)
ggmap::geocode("ekonomikum")
## Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=ekonomikum&sensor=false
##       lon     lat
## 1 17.6212 59.8591
library(leaflet)

m <- leaflet() # Funktionen leaflet
m <- addTiles(m)
m <- addMarkers(m,
                lng=17.61982,
                lat=59.85945,
                popup="Ekonomikum")
m

5.2 quantmod

Paket-författarna själva beskriver quantmod som ett “Quantitative Financial Modelling and Trading Framework for R”. Det finns en mängd funktioner, med här demonstrerar jag hur du kan ladda ner data från enskilda aktier eller börsindex. Du behöver registrera dig på tiingo.com för att få en API-nyckel. Efter registrering, logga in och gå till

API>Documentation>2.2.1 Daily Prices

En bit ner på sidan hittar du din API-nyckel

Skriv följande rad i R så att du sparar ett objekt key med din API-nyckel

key <- "..............." # Byt ut .... mot din nyckel

Vi kan exempelvis ladda ner data Facebooks aktie, använd funktionen getSymbols(), argumentet src är varifrån vi hämtar data, api.key är helt enkelt din API-nyckel. Data kommer sparas som ett objekt FB.

library(quantmod)
getSymbols("FB", src = "tiingo",api.key = key) 
## [1] "FB"
?getSymbols

Vi kan inspektera de fem senaste dagarna med tail()

tail(FB, 5)
##            FB.Open FB.High FB.Low FB.Close FB.Volume
## 2018-09-10 163.510  165.01 162.16   164.18  20197680
## 2018-09-11 163.940  167.19 163.72   165.94  20457088
## 2018-09-12 163.250  164.49 161.80   162.00  24078118
## 2018-09-13 162.000  163.32 160.86   161.36  25453775
## 2018-09-14 161.715  162.84 160.34   162.32  21770405

…och skapa en tidsserieplot med plot()

plot(FB$FB.Close,col="black")

Det är mycket som pågår under the hood här. Till exempel: hur vet funktionen plot() vad för sorts graf den ska rita, och var den ska leta efter tiden (som visas på x-axeln)? Går man in på djupet blir det snabbt väldigt komplicerat, och vi lämnar såldes denna diskussion tills vidare.

5.3 dplyr

Här kommer jag introducera paketet dplyr som är ett fantastiskt intuitivt sätt att manipulera data. Först måste du i vanlig ordning installera paketet med install.packages(). Glöm inte citationstecken. Sedan

library(dplyr)

I dplyr finns %>%. Med %>% (som kallas the pipe operator) behöver vi inte skriva det första argumentet i en funktion inuti själva funktionen. Det är mycket enklare att förstå med ett exempel. Notera hur dessa två funktioner (som avrundar x till en decimal) producerar samma resultat

x <- c(0.109, 0.359, 0.63, 0.996, 0.515, 0.142, 0.017, 0.829, 0.907)
round(x,1)
## [1] 0.1 0.4 0.6 1.0 0.5 0.1 0.0 0.8 0.9
x %>% round(1)
## [1] 0.1 0.4 0.6 1.0 0.5 0.1 0.0 0.8 0.9

I detta fallet går det så klart snabbare att bara skriva round(x,1), men när du applicerar många funktioner på x så skall du snart se att du kan skriva mycket mer intuitiv kod med %>%

round(exp(diff(log(x))), 1)
## [1]  3.3  1.8  1.6  0.5  0.3  0.1 48.8  1.1
x %>% log() %>% diff() %>% exp() %>% round(1)
## [1]  3.3  1.8  1.6  0.5  0.3  0.1 48.8  1.1

Framför allt är som sagt dplyr bra för datamanipulering. Den innehåller en rad bra funkltioner som jag demonstrerar nedan med hjälp av ett data set vi redan är bekanta med, gapminder.

library(gapminder)
gapminder
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # ... with 1,694 more rows

5.3.1 filter()

Som du ser så har gapminder 6 kolumner och 1704 rader. Vi börjar med funktionen filter() som väljer observationer baserat på deras värden. Säg att vi är intresserade av data där landet är Sverige.

gapminder %>% filter(country=="Sweden")
## # A tibble: 12 x 6
##    country continent  year lifeExp     pop gdpPercap
##    <fct>   <fct>     <int>   <dbl>   <int>     <dbl>
##  1 Sweden  Europe     1952    71.9 7124673     8528.
##  2 Sweden  Europe     1957    72.5 7363802     9912.
##  3 Sweden  Europe     1962    73.4 7561588    12329.
##  4 Sweden  Europe     1967    74.2 7867931    15258.
##  5 Sweden  Europe     1972    74.7 8122293    17832.
##  6 Sweden  Europe     1977    75.4 8251648    18856.
##  7 Sweden  Europe     1982    76.4 8325260    20667.
##  8 Sweden  Europe     1987    77.2 8421403    23587.
##  9 Sweden  Europe     1992    78.2 8718867    23880.
## 10 Sweden  Europe     1997    79.4 8897619    25267.
## 11 Sweden  Europe     2002    80.0 8954175    29342.
## 12 Sweden  Europe     2007    80.9 9031088    33860.

I stället för 1704 rader har vi nu bara 12, det vill säga alla värden där kolumnen country är lika med Sverige ("Sverige").

5.3.2 select()

Med select väljer vi helt enkelt kolumner baserat på deras namn. Vi har i vårt data set som sagt 6 kolumner, säg att vi är intresserade av endast en kolumn, nämligen den kolumn som heter country

gapminder %>% select(country)
## # A tibble: 1,704 x 1
##    country    
##    <fct>      
##  1 Afghanistan
##  2 Afghanistan
##  3 Afghanistan
##  4 Afghanistan
##  5 Afghanistan
##  6 Afghanistan
##  7 Afghanistan
##  8 Afghanistan
##  9 Afghanistan
## 10 Afghanistan
## # ... with 1,694 more rows

I sann %>%-anda kan vi självklart kombinera funktionerna. Säg att vi är intresserade av data på Sverige, och vi bara vill ha två kolumner: år och förväntad livslängd

gapminder %>%
  filter(country=="Sweden") %>% 
  select(year, lifeExp)
## # A tibble: 12 x 2
##     year lifeExp
##    <int>   <dbl>
##  1  1952    71.9
##  2  1957    72.5
##  3  1962    73.4
##  4  1967    74.2
##  5  1972    74.7
##  6  1977    75.4
##  7  1982    76.4
##  8  1987    77.2
##  9  1992    78.2
## 10  1997    79.4
## 11  2002    80.0
## 12  2007    80.9

I första steget väljer vi alla rader där country är lika med "Sverige" och i andra steget väljer vi kolumnerna som heter year och lifeExp.

5.3.3 mutate()

med mutate() skapar vi nya kolumner baserat på befintliga kolumner. Det vill säga, vi applicerar en funktion på en eller flera befintliga kolumner och skapar en ny. Vi har BNP per capita och vi har population, så vi skulle kunna skapa en ny kolumn, gdp, genom att multiplicera gdp per capita med population, i.e. gdpPercap*pop

gapminder %>% 
  mutate(gdp = gdpPercap*pop)
## # A tibble: 1,704 x 7
##    country     continent  year lifeExp      pop gdpPercap          gdp
##    <fct>       <fct>     <int>   <dbl>    <int>     <dbl>        <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.  6567086330.
##  2 Afghanistan Asia       1957    30.3  9240934      821.  7585448670.
##  3 Afghanistan Asia       1962    32.0 10267083      853.  8758855797.
##  4 Afghanistan Asia       1967    34.0 11537966      836.  9648014150.
##  5 Afghanistan Asia       1972    36.1 13079460      740.  9678553274.
##  6 Afghanistan Asia       1977    38.4 14880372      786. 11697659231.
##  7 Afghanistan Asia       1982    39.9 12881816      978. 12598563401.
##  8 Afghanistan Asia       1987    40.8 13867957      852. 11820990309.
##  9 Afghanistan Asia       1992    41.7 16317921      649. 10595901589.
## 10 Afghanistan Asia       1997    41.8 22227415      635. 14121995875.
## # ... with 1,694 more rows