Hva er R?


Når velger jeg å bruke R?

  1. Når det er eneste måte
  2. Når det sparer tid
  3. Når jeg skal løse en repeterende (kjedelig) oppgave
  4. Når jeg vil ha full kontroll over mine data
  5. Når jeg vil lære mer R
  6. Når jeg vil ha det gøy

Når bruker jeg ikke R?


De to-tre viktigste grunnene til å programmere

Skriptet ditt er for dine data det notatblokken er for din artikkel.

Skriptet ditt er for dine data det kakeoppskriften er for din kake.

Du har full kontroll, ref. pkt. 4.


R-syntaks


###Pakker som må installeres

#pakker - c("ggplot2", "writexl", "readxl", "tidyr", "dplyr", "rvest", "lubridate", "jsonlite", "networkD3", "htmlwidgets")
#install.packages(pakker)

Øvelse 1 - Last inn data: Elever i grunnskolen

#Øvelse 1: Elever i grunnskolen
#setwd("STI TIL FILENE DINE")

library(ggplot2)
library(writexl)

elever <- read.csv("data/elever.csv", sep=";")
str(elever)
## 'data.frame':    724 obs. of  7 variables:
##  $ region                                 : chr  "3001 Halden" "3002 Moss" "3003 Sarpsborg" "3004 Fredrikstad" ...
##  $ Elever.per.kommunal.skole..antall..2015: chr  "." "." "." "." ...
##  $ Elever.per.kommunal.skole..antall..2016: chr  "." "." "." "." ...
##  $ Elever.per.kommunal.skole..antall..2017: chr  "." "." "." "." ...
##  $ Elever.per.kommunal.skole..antall..2018: chr  "." "." "." "." ...
##  $ Elever.per.kommunal.skole..antall..2019: chr  "." "." "." "." ...
##  $ Elever.per.kommunal.skole..antall..2020: chr  "318.2" "309.5" "330.9" "303.2" ...
#Rydd opp i dataene
fjern <- c(2:6)

elever <- elever[-fjern]
names(elever) <- c("region", "antall_2020")

fjern.tomme <- which(elever$antall_2020 == ".")
elever <- elever[-fjern.tomme,]

#Ta vekk kommunenummer i navnet
elever$region <- substr(elever$region,6,nchar(elever$region))

elever$antall_2020 <- as.numeric(elever$antall_2020)

ggplot(elever, aes(x=region, y=antall_2020)) + geom_point()

elever <- elever[order(elever$antall_2020),]

#https://www.nrk.no/innlandet/800-elever-og-ansatte-ved-glommasvingen-skole-i-sor-odal-settes-i-karantene-1.15424260

elever$gruppe <- cut(elever$antall_2020, breaks = c(0,100,200,300,400,Inf))

#Lag en grafisk fremstilling
ggplot(elever, aes(x=region, y=antall_2020, color=gruppe)) + geom_point()

ggplot(elever, aes(x=region, y=antall_2020, color=gruppe)) + geom_point() +
  geom_text(aes(label=ifelse(antall_2020 > 400,as.character(region),"")),hjust=1.1,vjust=0) +
  theme(axis.text.x = element_blank(), 
        axis.ticks.x = element_blank()) +
  ggtitle("Antall elever på norske grunnskoler \npr. kommune (2020)")

write_xlsx(elever, "data/elever.xlsx")

Øvelse 2 - Skrape Wikipedia-tabeller

library(rvest)

url <- "https://no.wikipedia.org/wiki/Norge"

xpath <- as.character('//*[@id="mw-content-text"]/div/table[3]')
tabell <- url %>% read_html() %>% html_nodes(xpath=xpath) %>% html_table()
tabell
## [[1]]
## # A tibble: 20 × 4
##    ``        Tettsted              Folkemengde `Areal, km²`
##    <chr>     <chr>                 <chr>       <chr>       
##  1 1 av 983  Oslo                  1 043 168   270,45      
##  2 2 av 983  Bergen                265 470     90,3        
##  3 3 av 983  Stavanger/Sandnes     229 911     80,09       
##  4 4 av 983  Trondheim             191 771     58,61       
##  5 5 av 983  Fredrikstad/Sarpsborg 117 663     59,95       
##  6 6 av 983  Drammen               110 236     47,34       
##  7 7 av 983  Porsgrunn/Skien       94 102      53,83       
##  8 8 av 983  Kristiansand          64 913      25,08       
##  9 9 av 983  Ålesund               54 399      28,53       
## 10 10 av 983 Tønsberg              53 818      26,23       
## 11 11 av 983 Moss                  47 725      22,13       
## 12 13 av 983 Haugesund             45 436      21,26       
## 13 12 av 983 Sandefjord            45 520      24,19       
## 14 14 av 983 Bodø                  42 351      14,84       
## 15 15 av 983 Tromsø                40 979      13,65       
## 16 16 av 983 Arendal               37 861      27,28       
## 17 17 av 983 Hamar                 28 535      13,95       
## 18 19 av 983 Halden                25 887      14,23       
## 19 18 av 983 Larvik                26 731      15,04       
## 20 20 av 983 Askøy                 23 952      15,04
#Kan vi lage en generisk funksjon? 
get.table <- function(url, nr) {
  xpath <- paste0('//*[@id="mw-content-text"]/div/table[', nr, ']', collapse = "")
tabell <- url %>% read_html() %>% html_nodes(xpath=xpath) %>% html_table()
tabell
}

#Kan vi hente ut flere på en gang?
sider <- c("https://no.wikipedia.org/wiki/USA", "https://no.wikipedia.org/wiki/Norge","https://no.wikipedia.org/wiki/Tyskland")

sider
## [1] "https://no.wikipedia.org/wiki/USA"     
## [2] "https://no.wikipedia.org/wiki/Norge"   
## [3] "https://no.wikipedia.org/wiki/Tyskland"
lapply(1:length(sider), function(x) get.table(sider[x],2))
## [[1]]
## [[1]][[1]]
## # A tibble: 9 × 2
##   Rase                                      Prosent                       
##   <chr>                                     <chr>                         
## 1 kaukasoide-amerikanere                    72,4 (ikke-spanske hvite 63,7)
## 2 Afroamerikanere                           12,6                          
## 3 Asiatisk                                  4,8                           
## 4 Innfødte fra Hawaii og stillehavsøyene    0,9                           
## 5 Amerikanske innfødte og innfødte i Alaska 0,9                           
## 6 Andre                                     6,2                           
## 7 Multietniske (to eller flere raser)       2,9                           
## 8 Latinamerikanere (uansett rase)           16,3                          
## 9 Ikke-latinamerikansk (uansett rase)       83,7                          
## 
## 
## [[2]]
## [[2]][[1]]
## # A tibble: 6 × 6
##   `Storby (tettsted)`   `Vinter  (des-feb)` `Vår(mar-mai)` `Sommer(jun-aug)`
##   <chr>                 <chr>               <chr>          <chr>            
## 1 Oslo                  1 °C                14 °C          21 °C            
## 2 Bergen                4 °C                11 °C          19 °C            
## 3 Stavanger/Sandnes     3 °C                11 °C          18 °C            
## 4 Trondheim             0 °C                9 °C           18 °C            
## 5 Fredrikstad/Sarpsborg 0 °C                11 °C          21 °C            
## 6 Drammen               –1 °C               12 °C          21 °C            
## # … with 2 more variables: `Høst(sep-nov)` <chr>, `Nedbør(per år)` <chr>
## 
## 
## [[3]]
## [[3]][[1]]
## # A tibble: 17 × 8
##    Delstat   `Innbyggere[mi…` `Katolikker[mi…` `Protestanter[…` `Andre[million…`
##    <chr>     <chr>            <chr>            <chr>            <chr>           
##  1 Baden-Wü… 10,75            4,12             3,69             2,95            
##  2 Bayern    12,52            7,32             2,74             2,45            
##  3 Berlin    3,42             0,32             0,74             2,37            
##  4 Brandenb… 2,54             0,08             0,50             1,97            
##  5 Bremen    0,66             0,06             0,29             0,29            
##  6 Hamburg   1,77             0,18             0,58             1,01            
##  7 Hessen    6,07             1,57             2,53             1,97            
##  8 Mecklenb… 1,68             0,06             0,31             1,31            
##  9 Niedersa… 7,97             1,43             4,18             2,37            
## 10 Nordrhei… 18,00            7,81             5,11             5,08            
## 11 Rheinlan… 4,05             1,90             1,30             0,85            
## 12 Saarland  1,04             0,68             0,20             0,15            
## 13 Sachsen   4,22             0,15             0,90             3,21            
## 14 Sachsen-… 2,41             0,09             0,45             1,87            
## 15 Schleswi… 2,84             0,17             1,62             1,05            
## 16 Thüringen 2,29             0,19             0,60             1,51            
## 17 Totalt    82,22            25,49            24,83            31,90           
## # … with 3 more variables: `Katolikker[%]` <chr>, `Protestanter[%]` <chr>,
## #   `Andre[%]` <chr>

Øvelse 3 - Last inn data: Areal vs befolkning

##Areal vs befolkning

library(ggplot2)
library(readxl)

options(scipen = 999) #Ta vekk vitenskapsnotasjon

kommuner <- read_xlsx("data/kommuner.xlsx")
names(kommuner) <- c("komnr", "navn", "admsenter", "fylke", "befolkning", "areal", "språk", 
                     "ordfører", "parti")
kommuner$språk <- gsub("Neutral", "Nøytral", kommuner$språk)
kommuner$befolkning <- gsub(",", "", kommuner$befolkning)
str(kommuner)
## tibble [356 × 9] (S3: tbl_df/tbl/data.frame)
##  $ komnr     : chr [1:356] "0301" "1101" "1103" "1106" ...
##  $ navn      : chr [1:356] "Oslo" "Eigersund" "Stavanger" "Haugesund" ...
##  $ admsenter : chr [1:356] "Oslo" "Egersund" "Stavanger" "Haugesund" ...
##  $ fylke     : chr [1:356] "Oslo" "Rogaland" "Rogaland" "Rogaland" ...
##  $ befolkning: chr [1:356] "673469" "14898" "141186" "37167" ...
##  $ areal     : chr [1:356] "454.03" "431.66" "262.52" "72.72" ...
##  $ språk     : chr [1:356] "Nøytral" "Bokmål" "Bokmål" "Bokmål" ...
##  $ ordfører  : chr [1:356] "Marianne Borgen" "Leif Erik Egaas" "Kari Nessa Nordtun" "Petter Steen jr" ...
##  $ parti     : chr [1:356] "SV" "H" "Ap" "H" ...
kommuner$befolkning <- as.integer(kommuner$befolkning)
kommuner$areal <- as.numeric(gsub(",", "", kommuner$areal))
str(kommuner)
## tibble [356 × 9] (S3: tbl_df/tbl/data.frame)
##  $ komnr     : chr [1:356] "0301" "1101" "1103" "1106" ...
##  $ navn      : chr [1:356] "Oslo" "Eigersund" "Stavanger" "Haugesund" ...
##  $ admsenter : chr [1:356] "Oslo" "Egersund" "Stavanger" "Haugesund" ...
##  $ fylke     : chr [1:356] "Oslo" "Rogaland" "Rogaland" "Rogaland" ...
##  $ befolkning: int [1:356] 673469 14898 141186 37167 76328 3331 3237 2826 18762 19042 ...
##  $ areal     : num [1:356] 454 431.7 262.5 72.7 304.5 ...
##  $ språk     : chr [1:356] "Nøytral" "Bokmål" "Bokmål" "Bokmål" ...
##  $ ordfører  : chr [1:356] "Marianne Borgen" "Leif Erik Egaas" "Kari Nessa Nordtun" "Petter Steen jr" ...
##  $ parti     : chr [1:356] "SV" "H" "Ap" "H" ...
#Legg til kolonne med befolkningstetthet
kommuner$tetthet <- kommuner$befolkning / kommuner$areal

gg <- ggplot(kommuner, aes(x=areal, y=befolkning)) +
  geom_point(aes(col=fylke, size=tetthet)) + 
  geom_smooth(method="loess", se=F) + 
  xlim(c(0,9750)) + 
  ylim(c(0,675000)) +
  labs(subtitle = "Areal vs befolkning",
       y="Befolkning",
       x="Areal",
       title="Scatterplot")

theme_set(theme_bw())

plot(gg)
## `geom_smooth()` using formula 'y ~ x'

#Ta vekk Oslo og kommuner med størst areal
minste <- subset(kommuner, kommuner$areal < 500)
minste <- subset(minste, minste$navn != "Oslo")

ggminste <- ggplot(minste, aes(x=areal, y=befolkning)) +
  geom_point(aes(col=fylke, size=tetthet)) + 
  geom_smooth(method="loess", se=F) + 
  xlim(c(0,500)) + 
  ylim(c(0,300000)) +
  labs(subtitle = "Areal vs befolkning, kommuner < 500km^2, unntatt Oslo",
       y="Befolkning",
       x="Areal",
       title="Scatterplot")

plot(ggminste)
## `geom_smooth()` using formula 'y ~ x'


Øvelse 4 - Valg: Mandatberegning

I Norge brukes Sainte-Laguës modifiserte metode for å beregne hvor mange mandater hvert parti skal ha.

##Beregne stortingsmandater

library(tidyr)
library(dplyr)
library(writexl)

#Laste inn valglister fra Valgdirektoratet
lister <- read.csv("data/lister21.csv", fileEncoding = "UTF-8")
str(lister)
## 'data.frame':    5174 obs. of  13 variables:
##  $ election_path: chr  "210001.01.01.000001" "210001.01.01.000001" "210001.01.01.000001" "210001.01.01.000001" ...
##  $ valg         : chr  "Stortingsvalget 2021" "Stortingsvalget 2021" "Stortingsvalget 2021" "Stortingsvalget 2021" ...
##  $ valgdistrikt : chr  "Østfold" "Østfold" "Østfold" "Østfold" ...
##  $ partikode    : chr  "AAN" "AAN" "AAN" "AAN" ...
##  $ partinavn    : chr  "Alliansen - Alternativ for Norge" "Alliansen - Alternativ for Norge" "Alliansen - Alternativ for Norge" "Alliansen - Alternativ for Norge" ...
##  $ display_order: int  2 2 2 2 2 2 2 2 2 2 ...
##  $ kandidatnr   : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ navn         : chr  "Hans Jørgen Lysglimt Johansen" "Bjørn Inge Johansen" "Jarle Johansen" "Kaspar Johan Birkeland" ...
##  $ bosted       : chr  "Oslo" "Orkland" "Giske" "Ålesund" ...
##  $ stilling     : chr  "" "" "" "" ...
##  $ fødselsdato  : chr  "13.09.1971" "03.08.1970" "14.11.1960" "18.06.1951" ...
##  $ alder        : int  50 51 60 70 53 57 36 49 71 47 ...
##  $ kjønn        : chr  "Mann" "Mann" "Mann" "Mann" ...
fylkesfordeling <- read.csv("data/partifordeling.csv", sep=";", fileEncoding = "UTF-8")

distriktsres <- fylkesfordeling[c(1,2,7,8,9,10,13)]

names(distriktsres) <- c("fnr", "fylke", "kode", "parti", "pros","ant_velgere", "stemmer")
distriktsres$pros <- gsub(",", "\\.", distriktsres$pros)
distriktsres$pros <- as.numeric(distriktsres$pros)

delingstall <- c(1.4, seq(3,129,2))
delingstall
##  [1]   1.4   3.0   5.0   7.0   9.0  11.0  13.0  15.0  17.0  19.0  21.0  23.0
## [13]  25.0  27.0  29.0  31.0  33.0  35.0  37.0  39.0  41.0  43.0  45.0  47.0
## [25]  49.0  51.0  53.0  55.0  57.0  59.0  61.0  63.0  65.0  67.0  69.0  71.0
## [37]  73.0  75.0  77.0  79.0  81.0  83.0  85.0  87.0  89.0  91.0  93.0  95.0
## [49]  97.0  99.0 101.0 103.0 105.0 107.0 109.0 111.0 113.0 115.0 117.0 119.0
## [61] 121.0 123.0 125.0 127.0 129.0
length(delingstall)
## [1] 65
#Antall distriktsmandater pr.fylke
ant.dman <- data.frame(fnr = c(1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,20),
                       man = c(8,18,19,6,5,7,6,5,3,5,13,15,3,7,9,4,8,5,4))

#Lag funksjon som beregner distriktsmandater for hvert fylke

get.fylkesres <- function(f) {
m <- ant.dman[f,2] #Antall mandater i fylke f

fylkesres <- subset(distriktsres, fnr==ant.dman[f,1]) #Hvilke resultater har vi for fylke f?

#Funksjon som regner ut st.Laguë for et bestemt delingstall
stlague <- function(i){
  del <- fylkesres$stemmer/delingstall[i]
  fylkesres <<- cbind(fylkesres, del)
}

fylkesres <- lapply(1:m, function(i) stlague(i))

fylkesres <- as.data.frame(fylkesres[[m]])
dels <- paste0("del",1:m)
dels <- c("fnr", "fylke","kode", "parti", "pros", "ant_velgere", "stemmer", dels)

names(fylkesres) <- dels
head(fylkesres)
fylkesres <- pivot_longer(fylkesres, cols = starts_with("del")) %>%
  arrange(-value)

fylkesres$name <- gsub("del", "", fylkesres$name)
fylkesres$name <- as.integer(fylkesres$name)
fylkesres <- fylkesres[1:m,]

#Finne politikernavn
get.pol <- function(j) {
  lister %>% dplyr::filter(valgdistrikt == as.character(fylkesres[j,2]),
                    partikode == as.character(fylkesres[j,3]),
                    kandidatnr == as.integer(fylkesres[j,8])) %>% 
                    select(navn)
}

pols <- data.frame(unlist(sapply(1:m, function(j) get.pol(j))))
names(pols) <- "kandidat"
fylkesres <- cbind(fylkesres, pols) 

return(fylkesres)
}

#Beregne alle distriktsmandater og lagre dem som Excel-fil
library(writexl)
alle <- lapply(1:19, function(x) get.fylkesres(x))
alle <- do.call("rbind", alle)

write_xlsx(alle, "data/distriktsmandater_2021.xlsx")

Øvelse 5 - Temperaturvarsel i sanntid

Mål: Lage et skript som henter temperaturdata fra Yr og lagrer dem.

library(jsonlite)
library(ggplot2)
library(lubridate)

#Hente data
yrurl <- "https://api.met.no/weatherapi/locationforecast/2.0/complete?altitude=0&lat=60.39299&lon=5.32415"
yr <- fromJSON(yrurl)

#Ta en kikk
#head(yr)
str(yr)
## List of 3
##  $ type      : chr "Feature"
##  $ geometry  :List of 2
##   ..$ type       : chr "Point"
##   ..$ coordinates: num [1:3] 5.32 60.39 0
##  $ properties:List of 2
##   ..$ meta      :List of 2
##   .. ..$ updated_at: chr "2022-11-07T15:46:47Z"
##   .. ..$ units     :List of 24
##   .. .. ..$ air_pressure_at_sea_level    : chr "hPa"
##   .. .. ..$ air_temperature              : chr "celsius"
##   .. .. ..$ air_temperature_max          : chr "celsius"
##   .. .. ..$ air_temperature_min          : chr "celsius"
##   .. .. ..$ air_temperature_percentile_10: chr "celsius"
##   .. .. ..$ air_temperature_percentile_90: chr "celsius"
##   .. .. ..$ cloud_area_fraction          : chr "%"
##   .. .. ..$ cloud_area_fraction_high     : chr "%"
##   .. .. ..$ cloud_area_fraction_low      : chr "%"
##   .. .. ..$ cloud_area_fraction_medium   : chr "%"
##   .. .. ..$ dew_point_temperature        : chr "celsius"
##   .. .. ..$ fog_area_fraction            : chr "%"
##   .. .. ..$ precipitation_amount         : chr "mm"
##   .. .. ..$ precipitation_amount_max     : chr "mm"
##   .. .. ..$ precipitation_amount_min     : chr "mm"
##   .. .. ..$ probability_of_precipitation : chr "%"
##   .. .. ..$ probability_of_thunder       : chr "%"
##   .. .. ..$ relative_humidity            : chr "%"
##   .. .. ..$ ultraviolet_index_clear_sky  : chr "1"
##   .. .. ..$ wind_from_direction          : chr "degrees"
##   .. .. ..$ wind_speed                   : chr "m/s"
##   .. .. ..$ wind_speed_of_gust           : chr "m/s"
##   .. .. ..$ wind_speed_percentile_10     : chr "m/s"
##   .. .. ..$ wind_speed_percentile_90     : chr "m/s"
##   ..$ timeseries:'data.frame':   84 obs. of  2 variables:
##   .. ..$ time: chr [1:84] "2022-11-07T16:00:00Z" "2022-11-07T17:00:00Z" "2022-11-07T18:00:00Z" "2022-11-07T19:00:00Z" ...
##   .. ..$ data:'data.frame':  84 obs. of  4 variables:
##   .. .. ..$ instant      :'data.frame':  84 obs. of  1 variable:
##   .. .. .. ..$ details:'data.frame': 84 obs. of  17 variables:
##   .. .. .. .. ..$ air_pressure_at_sea_level    : num [1:84] 998 998 999 999 1000 ...
##   .. .. .. .. ..$ air_temperature              : num [1:84] 8.1 7.8 7.4 7.1 7.5 8.3 8.9 8.8 9 9.1 ...
##   .. .. .. .. ..$ air_temperature_percentile_10: num [1:84] 7.3 6.9 6.6 6.1 6.5 7 7.3 7.7 7.7 8.2 ...
##   .. .. .. .. ..$ air_temperature_percentile_90: num [1:84] 8.8 8.7 8.3 8.4 8.8 9.2 9.7 10 10 10 ...
##   .. .. .. .. ..$ cloud_area_fraction          : num [1:84] 63.7 44.6 6.9 29.2 65.4 95.5 71.8 61.1 90.4 100 ...
##   .. .. .. .. ..$ cloud_area_fraction_high     : num [1:84] 0 0 0 13 2.2 1.8 16.9 5.1 0 3.4 ...
##   .. .. .. .. ..$ cloud_area_fraction_low      : num [1:84] 19.7 22.8 6.7 20 63.2 95.1 67.9 56.7 55.9 99.8 ...
##   .. .. .. .. ..$ cloud_area_fraction_medium   : num [1:84] 5.6 0.5 0 0 0 0 6.4 12.9 87.2 100 ...
##   .. .. .. .. ..$ dew_point_temperature        : num [1:84] 5 4.6 4 4.3 4.5 5.2 5.5 5.4 5.1 5.4 ...
##   .. .. .. .. ..$ fog_area_fraction            : num [1:84] 0 0 0 0 0 0 0 0 0 0 ...
##   .. .. .. .. ..$ relative_humidity            : num [1:84] 90.7 89.4 87.6 89.3 88.6 87.4 85.6 85.6 83.1 84.3 ...
##   .. .. .. .. ..$ ultraviolet_index_clear_sky  : num [1:84] 0 0 0 0 0 0 0 0 0 0 ...
##   .. .. .. .. ..$ wind_from_direction          : num [1:84] 146 145 143 145 142 ...
##   .. .. .. .. ..$ wind_speed                   : num [1:84] 3.2 3.4 3.6 3.7 4 4.1 4.8 5 4.8 5.4 ...
##   .. .. .. .. ..$ wind_speed_of_gust           : num [1:84] 5.4 5.8 6.2 6.3 7.2 7.2 8.4 9.1 8.8 9.6 ...
##   .. .. .. .. ..$ wind_speed_percentile_10     : num [1:84] 2.3 2.9 3.1 3.1 3.5 3.7 4 4.4 4.4 5.1 ...
##   .. .. .. .. ..$ wind_speed_percentile_90     : num [1:84] 3.6 3.7 4.1 4 4.4 4.6 5.2 5.4 5.8 6 ...
##   .. .. ..$ next_12_hours:'data.frame':  84 obs. of  2 variables:
##   .. .. .. ..$ summary:'data.frame': 84 obs. of  2 variables:
##   .. .. .. .. ..$ symbol_code      : chr [1:84] "lightrainshowers_day" "lightrainshowers_day" "lightrainshowers_day" "lightrain" ...
##   .. .. .. .. ..$ symbol_confidence: chr [1:84] "somewhat certain" "somewhat certain" "certain" "certain" ...
##   .. .. .. ..$ details:'data.frame': 84 obs. of  1 variable:
##   .. .. .. .. ..$ probability_of_precipitation: num [1:84] 64.3 77.4 89.4 96.4 99.8 100 100 100 100 100 ...
##   .. .. ..$ next_1_hours :'data.frame':  84 obs. of  2 variables:
##   .. .. .. ..$ summary:'data.frame': 84 obs. of  1 variable:
##   .. .. .. .. ..$ symbol_code: chr [1:84] "partlycloudy_night" "partlycloudy_night" "clearsky_night" "fair_night" ...
##   .. .. .. ..$ details:'data.frame': 84 obs. of  5 variables:
##   .. .. .. .. ..$ precipitation_amount        : num [1:84] 0 0 0 0 0 0 0 0 0.2 0.9 ...
##   .. .. .. .. ..$ precipitation_amount_max    : num [1:84] 0 0 0 0 0 0 0 0.2 0.6 1.4 ...
##   .. .. .. .. ..$ precipitation_amount_min    : num [1:84] 0 0 0 0 0 0 0 0 0 0.1 ...
##   .. .. .. .. ..$ probability_of_precipitation: num [1:84] 3.1 5.4 1.9 0 0 0 1.1 13 44 73.8 ...
##   .. .. .. .. ..$ probability_of_thunder      : num [1:84] 0.1 0 0 0.1 0.3 0.3 0.2 0.5 0.7 1.2 ...
##   .. .. ..$ next_6_hours :'data.frame':  84 obs. of  2 variables:
##   .. .. .. ..$ summary:'data.frame': 84 obs. of  1 variable:
##   .. .. .. .. ..$ symbol_code: chr [1:84] "partlycloudy_night" "partlycloudy_night" "partlycloudy_night" "partlycloudy_night" ...
##   .. .. .. ..$ details:'data.frame': 84 obs. of  6 variables:
##   .. .. .. .. ..$ air_temperature_max         : num [1:84] 8.9 8.9 9 9.1 9.1 9.6 9.8 9.8 10.2 10.8 ...
##   .. .. .. .. ..$ air_temperature_min         : num [1:84] 7.1 7.1 7.1 7.5 8.3 8.8 8.8 9 9 9 ...
##   .. .. .. .. ..$ precipitation_amount        : num [1:84] 0 0 0 0 1.2 1.4 1.6 2 2.3 2 ...
##   .. .. .. .. ..$ precipitation_amount_max    : num [1:84] 0 0 0 0.8 1.4 2.1 3 4.1 4.5 4.9 ...
##   .. .. .. .. ..$ precipitation_amount_min    : num [1:84] 0 0 0 0 0.1 0.2 0.3 0.4 0.7 1.1 ...
##   .. .. .. .. ..$ probability_of_precipitation: num [1:84] 3 2 1.7 17.7 37.9 49.2 62.9 77.3 89.1 96 ...
#Fikse tidsformatet
tid <- yr$properties$timeseries$time
tid <- gsub("Z", "", tid)
tid <- gsub("T", " ", tid)
tid <- ymd_hms(tid, tz=Sys.timezone())
tid <- tid + 2*60*60

#Finne temperaturene
temp <- yr$properties$timeseries$data$instant$details$air_temperature

#Lag data frame (=regneark)
tempbergen <- data.frame(tid=tid, temp=temp)
#head(tempbergen)

#Lag et plot
tempplot <- ggplot(tempbergen, aes(x=tid, y=temp)) + geom_point() +
  xlab("dato") + ylab("temperatur") +
  labs(title = "Temperaturvarsel for Bergen") 

tempplot

tempplot + geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

#Lagre dataene med unikt filnavn
dir.create("data/temp/")
## Warning in dir.create("data/temp/"): 'data\temp' already exists
filnavn <- paste0("data/temp/yrbergen_",Sys.time(),".csv")
filnavn <- gsub(" ", "_", filnavn)
filnavn <- gsub(":", "-", filnavn)
write.csv(tempbergen, filnavn, row.names = FALSE)

Øvelse 6 - Lage et nettverk

#http://christophergandrud.github.io/networkD3/

library(readxl)
library(networkD3)
library(htmlwidgets)
## 
## Attaching package: 'htmlwidgets'
## The following object is masked from 'package:networkD3':
## 
##     JS
library(tidyr)

nettverk <- read_xlsx("data/nettverk.xlsx")

#simple plot

p <- simpleNetwork(nettverk, height="200px", width="200px",        
                   Source = 1,                 # Kolonnen til source
                   Target = 2,                 # Kolonnen til target
                   linkDistance = 10,          # Avstand mellom nodene. Øk verdien for mer rom mellom nodene
                   charge = -900,              # Numerisk verdi som angir enten styrken i frastøtelse (negativt tall) eller tiltrekning (positivt tall)
                   fontSize = 14,              # Størrelse på nodenavn
                   fontFamily = "serif",       # Font
                   linkColour = "#666",        # Farge på strekene, må være felles for hele grafen
                   nodeColour = "#69b3a2",     # Farge på nodene, må være felles for hele grafen
                   opacity = 0.9,              # Nodenes grad av gjennomsiktighet. 0=transparent. 1=ingen transparens
                   zoom = T                    # Kan du zoome?
)

p
saveWidget(p, file="data/enkelgraf.html")

#Litt mer avansert variant

fra <- data.frame(nettverk[,1])
fra <- as.character(unlist(fra))
til <- data.frame(nettverk[,2])
til <- as.character(unlist(til))

nodefactors <- c(fra, til)
nodefactors <- as.factor(sort(unique(nodefactors)))

source <- match(fra, levels(nodefactors)) - 1
target <- match(til, levels(nodefactors)) - 1

links <- data.frame(Source = source, Target = target)
noder <- data.frame(name=nodefactors, group=1:length(nodefactors), size=20)

nytt.nettverk <- forceNetwork(Links = links, 
                  Nodes = noder,
                  Source= "Source", 
                  Target = "Target",
                  Group = "group",
                  Nodesize = "size",
                  NodeID = "name",
                  charge = -500, 
                  linkDistance = 100,
                  zoom = T, 
                  opacity = 0.9,
                  fontSize=14,
                  fontFamily = "Arial",
                  opacityNoHover = 1,
                  legend = FALSE,
                  linkWidth = 2,
                  linkColour = "#767576"
                  #width=600
                  )

nytt.nettverk
saveWidget(nytt.nettverk, file="data/nytt_nettverk.html")