Det första inlägget jag skrev på den här bloggen handlade om att ladda hem data med hjälp av pxweb-paketet. Sedan dess har det kommit en ny version av pxweb. Den gamla koden jag publicerat fungerar fortfarande, men den nya versionen av pxweb fungerar annorlunda än den gamla: Koden som genereras ser annorlunda ut och ny funktionalitet har tillkommit. Det allra bästa med den nya versionen är att det går att hoppa över dimensioner. Vill man bara ha befolkning per kommun så kan man till exempel välja att inte ladda ner civilstånd och kön. Tidigare fick man plocka hem alla dimensioner som fanns i tabellen hos SCB, för att därefter aggregera lokalt i R.
# Börja med att starta i interaktivt läge
library(pxweb)
d <- pxweb_interactive("api.scb.se")
# Notera att de smugit sig in ett fel i det exempel som finns om hur
# man använder pxweb_interactive() i dokumentationen som medföljer paketet.
# I dokumentationen står det: "pxweb_interactive(api = "api.scb.se")",
# vilket genererar ett fel.
Nu har vi startat en interaktiv session där vi med hjälp av menyval i konsolfönstret bygger frågan vi ska skicka till SCB:s databas:
==============================================================
R PXWEB: Content of 'api.scb.se'
==============================================================
[ 1 ] : v1
==============================================================
Enter your choice:
('esc' = Quit, 'i' = Show id)
1: 1
Skriv in siffran “1” för att välja att du vill ha version 1 av api:et (ett enkelt val eftersom det är det enda alternativet). Därefter väljer man språk:
=============================================================
R PXWEB: Content of 'api.scb.se'
at '/OV0104/v1'
=============================================================
[ 1 ] : en
[ 2 ] : sv
=============================================================
Enter your choice:
('esc' = Quit, 'b' = Back, 'i' = Show id)
1: 2
Jag väljer att jag vill ha svenska som språk genom att trycka på “2” och enter. Därefter väljer jag alternativ “1” för att komma till statistikdatabasen.
=============================================================
R PXWEB: Content of 'api.scb.se'
at '/OV0104/v1/doris/sv'
=============================================================
[ 1 ] : Statistikdatabasen
=============================================================
Enter your choice:
('esc' = Quit, 'b' = Back, 'i' = Show id)
1: 1
Efter att ha valt statistikdatabasen kommer vi in i SCB:s öppna databas. Som default visas bara de översta och den nedersta valmöjligheterna. Vill man se alla möjliga val får man trycka på “a” och enter.
======================================================================================================================
R PXWEB: Content of 'api.scb.se'
at '/OV0104/v1/doris/sv/ssd'
======================================================================================================================
[ 1 ] : Ämnesövergripande statistik
[ 2 ] : Arbetsmarknad
[ 3 ] : Befolkning
[ 4 ] : Boende, byggande och bebyggelse
[ 18 ] : Priser och konsumtion
[ 19 ] : Socialtjänst
[ 20 ] : Transporter och kommunikationer
[ 21 ] : Utbildning och forskning
======================================================================================================================
Enter your choice:
('esc' = Quit, 'b' = Back, 'a' = Show all, 'i' = Show id)
1: 3
Vi väljer “3” (Befolkning) och därefter “2” (Befolningsstatistik). Då kommer vi in i följande meny:
======================================================================================================================
R PXWEB: Content of 'api.scb.se'
at '/OV0104/v1/doris/sv/ssd/BE/BE0101'
======================================================================================================================
[ 1 ] : Folkmängd
[ 2 ] : Medelålder
[ 3 ] : Befolkningstäthet
[ 4 ] : Medelfolkmängd
[ 17 ] : Adopterade
[ 18 ] : Cirkulär migration
[ 19 ] : Nyckeltal
[ 20 ] : DeSo
======================================================================================================================
Enter your choice:
('esc' = Quit, 'b' = Back, 'a' = Show all, 'i' = Show id)
1: 1
Här väljer jag “1” (Folkmängd) och därefter “1” igen (Folkmängden efter region, civilstånd, ålder och kön. År 1968 - 2019). Nu är vi inne i den tabell vi vill plocka ut data ifrån.
======================================================================================================================
R PXWEB: Content of 'api.scb.se'
at '/OV0104/v1/doris/sv/ssd/BE/BE0101/BE0101A/BefolkningNy'
TABLE: Folkmängden efter region, civilstånd, ålder, kön, tabellinnehåll och år
VARIABLE: [[Region]], Civilstand, Alder, Kon, ContentsCode, Tid
======================================================================================================================
[ 1 ] : Riket
[ 2 ] : Stockholms län
[ 3 ] : Upplands Väsby
[ 4 ] : Vallentuna
[ 309 ] : Piteå
[ 310 ] : Boden
[ 311 ] : Haparanda
[ 312 ] : Kiruna
======================================================================================================================
Enter one or more choices:
Separate multiple choices by ',' and intervals of choices by ':'
('esc' = Quit, 'b' = Back, '*' = Select all, 'a' = Show all, 'e' = Eliminate, 'i' = Show id)
1: a
Jag väljer att trycka på “a” för att visa alla regioner som kan väljas (här visas bara nederdelen av de menyval som kan göras):
[ 296 ] : Lycksele
[ 297 ] : Skellefteå
[ 298 ] : Norrbottens län
[ 299 ] : Arvidsjaur
[ 300 ] : Arjeplog
[ 301 ] : Jokkmokk
[ 302 ] : Överkalix
[ 303 ] : Kalix
[ 304 ] : Övertorneå
[ 305 ] : Pajala
[ 306 ] : Gällivare
[ 307 ] : Älvsbyn
[ 308 ] : Luleå
[ 309 ] : Piteå
[ 310 ] : Boden
[ 311 ] : Haparanda
[ 312 ] : Kiruna
======================================================================================================================
Enter one or more choices:
Separate multiple choices by ',' and intervals of choices by ':'
('esc' = Quit, 'b' = Back, '*' = Select all, 'e' = Eliminate, 'i' = Show id)
1: 1,107:139
Vid promten skriver jag in 1,107:139, vilket innebär att jag väljer riket samt alla kommuner i Skåne. Nästa meny handlar om att välja vilka civilstånd man vill plocka ut data för. Eftersom jag inte är intresserad av den dimensionen så trycker jag på “e” för att eliminera dimensionen.
======================================================================================================================
R PXWEB: Content of 'api.scb.se'
at '/OV0104/v1/doris/sv/ssd/BE/BE0101/BE0101A/BefolkningNy'
TABLE: Folkmängden efter region, civilstånd, ålder, kön, tabellinnehåll och år
VARIABLE: Region, [[Civilstand]], Alder, Kon, ContentsCode, Tid
======================================================================================================================
[ 1 ] : ogifta
[ 2 ] : gifta
[ 3 ] : skilda
[ 4 ] : änkor/änklingar
======================================================================================================================
Enter one or more choices:
Separate multiple choices by ',' and intervals of choices by ':'
('esc' = Quit, 'b' = Back, '*' = Select all, 'e' = Eliminate, 'i' = Show id)
1: e
Därefter kommer en meny för att välja åldrar. Jag väljer att se alla åldrar, vilket sker genom att skriva “102” och enter. Eftersom jag vill välja både män och kvinnor skriver jag en asterix "*" och trycker på enter.
======================================================================================================================
R PXWEB: Content of 'api.scb.se'
at '/OV0104/v1/doris/sv/ssd/BE/BE0101/BE0101A/BefolkningNy'
TABLE: Folkmängden efter region, civilstånd, ålder, kön, tabellinnehåll och år
VARIABLE: Region, Civilstand, Alder, [[Kon]], ContentsCode, Tid
======================================================================================================================
[ 1 ] : män
[ 2 ] : kvinnor
======================================================================================================================
Enter one or more choices:
Separate multiple choices by ',' and intervals of choices by ':'
('esc' = Quit, 'b' = Back, '*' = Select all, 'e' = Eliminate, 'i' = Show id)
1: *
I nästa meny väljer jag alternativ “1” (Folkmängd). I nästa meny väljer man vilket år data ska avse och där väljer jag att hämta data för 2019, vilket är alternativ “52”. I och med det så har jag gjort alla val av data som behövs. Nu återstår några sista val som rör hur tabellen ska hämtas hem. Jag väljer att hämta hem data och printa koden som behövs för nedladdningen i konsolen:
Do you want to print code to query and download data?
Enter your choice:
('esc' = Quit, 'y' = Yes, 'n' = No)
1: y
Därefter väljer jag att parametrarena i frågan till SCB:s databas ska sparas i list-format och inte i json:
Do you want to print query in json format (otherwise query is printed as an R list)?
Enter your choice:
('esc' = Quit, 'y' = Yes, 'n' = No)
1: n
Därefter väljer jag att ladda ner data (y):
Do you want to download the data?
Enter your choice:
('esc' = Quit, 'y' = Yes, 'n' = No)
1: y
Jag vill även att data ska sparas i en dataframe:
Do you want to return a the data as a data.frame?
Enter your choice:
('esc' = Quit, 'y' = Yes, 'n' = No)
1: y
Jag laddar inte hem citattexten för tabellen.
Do you want to print citation for the data?
Enter your choice:
('esc' = Quit, 'y' = Yes, 'n' = No)
1: n
Nu printas det ut en lång rad kod i konsolen som man kan klippa ut och klistra in i editorn i R:
# PXWEB query
pxweb_query_list <-
list("Region"=c("00","1214","1230","1231","1233","1256","1257","1260","1261","1262","1263","1264","1265","1266","1267","1270","1272","1273","1275","1276","1277","1278","1280","1281","1282","1283","1284","1285","1286","1287","1290","1291","1292","1293"),
"Alder"=c("tot"),
"Kon"=c("1","2"),
"ContentsCode"=c("BE0101N1"),
"Tid"=c("2019"))
# Download data
px_data <-
pxweb_get(url = "http://api.scb.se/OV0104/v1/doris/sv/ssd/BE/BE0101/BE0101A/BefolkningNy",
query = pxweb_query_list)
# Convert to data.frame
px_data <- as.data.frame(px_data, column.name.type = "text", variable.value.type = "text")
Nu har vi laddat hem befolkningsdata för 2019 för de valda regionerna och sparat dem i dataframen px_data:
head(px_data)
region ålder kön år Folkmängd
1 Riket totalt ålder män 2019 5195814
2 Riket totalt ålder kvinnor 2019 5131775
3 Svalöv totalt ålder män 2019 7475
4 Svalöv totalt ålder kvinnor 2019 6793
5 Staffanstorp totalt ålder män 2019 12589
6 Staffanstorp totalt ålder kvinnor 2019 12807
En sak kan ställa till problem om man jämför med den gamla versionen av pxweb. Som framgår av tabellen ovan så är alla variabler i klartext. Men ibland vill man ha variabelkoderna istället - till exempel kommunkoder. Om vi modifierar koden för att ladda hem data lite grand kan vi spara data med variabler i klartext i en dataframe och varialer i kodform i en annan:
# PXWEB query
pxweb_query_list <-
list("Region"=c("00","1214","1230","1231","1233","1256","1257","1260","1261","1262","1263","1264","1265","1266","1267","1270","1272","1273","1275","1276","1277","1278","1280","1281","1282","1283","1284","1285","1286","1287","1290","1291","1292","1293"),
"Alder"=c("tot"),
"Kon"=c("1","2"),
"ContentsCode"=c("BE0101N1"),
"Tid"=c("2019"))
# Download data
px_data <-
pxweb_get(url = "http://api.scb.se/OV0104/v1/doris/sv/ssd/BE/BE0101/BE0101A/BefolkningNy",
query = pxweb_query_list)
# Convert to data.frame
dfklartext <- as.data.frame(px_data, column.name.type = "text", variable.value.type = "text")
# Notera att jag ändrat variable.value.type från "text" till "code" nedan.
dfkoder <- as.data.frame(px_data, column.name.type = "text", variable.value.type = "code")
Nu finns alla värden med variabler i klartext i dfklartext medan alla värden med variabler i kodformat finns i df koder. Om jag tittar på dfkoder ser tabellen ut så här:
head(dfkoder)
region ålder kön år Folkmängd
1 00 tot 1 2019 5195814
2 00 tot 2 2019 5131775
3 1214 tot 1 2019 7475
4 1214 tot 2 2019 6793
5 1230 tot 1 2019 12589
6 1230 tot 2 2019 12807
Regionkoderna finns laddade i den första kolumnen. Om jag vill ha en tabell med både regionkoder och regionnamn kan jag hämta koderna från dfkoder och slå samman dem med dfklartext:
library(dplyr)
dfkoder_klartext <- bind_cols(dfkoder[1], dfklartext)
head(dfkoder_klartext)
region...1 region...2 ålder kön år Folkmängd
1 00 Riket totalt ålder män 2019 5195814
2 00 Riket totalt ålder kvinnor 2019 5131775
3 1214 Svalöv totalt ålder män 2019 7475
4 1214 Svalöv totalt ålder kvinnor 2019 6793
5 1230 Staffanstorp totalt ålder män 2019 12589
6 1230 Staffanstorp totalt ålder kvinnor 2019 12807
Eftersom “region” fanns som variabelnamn bägge tabellerna döps de om till “region…1” och “region…2” i den sammanslagna tabellen. Vi kan skapa bättre namn med hjälp av “rename”.
dfkoder_klartext <- dfkoder_klartext %>%
rename(reg_kod = region...1, reg_namn = region...2)
head(dfkoder_klartext)
reg_kod reg_namn ålder kön år Folkmängd
1 00 Riket totalt ålder män 2019 5195814
2 00 Riket totalt ålder kvinnor 2019 5131775
3 1214 Svalöv totalt ålder män 2019 7475
4 1214 Svalöv totalt ålder kvinnor 2019 6793
5 1230 Staffanstorp totalt ålder män 2019 12589
6 1230 Staffanstorp totalt ålder kvinnor 2019 12807