Hej Leute,

heute möchte ich Euch erklären, wie ihr mit Hilfe des R-Packages tabulizer Tabellen aus pdfs auslesen könnt, um sie dann als dataframe weiter zu bearbeiten.

 

Klingt erstmal vielleicht nicht so spannend, ist aber ziemlich nützlich. Stellt Euch vor, es gibt monatlich einen Bericht, der auf einer Website veröffentlicht wird und ihr wollt Tabelle daraus auslesen, um sie in Eurem eigenen Bericht zu verwenden oder einfach in eine Datenbank speichern, um die Daten für ein interaktives Dashboard bereit zu stellen. Jetzt könnt ihr jeden Monat den Bericht downloaden und die Zahlen in eine Exceltabelle abtippen oder ihr lest einfach weiter 😉

 

Wie oben schon gesagt, brauchen wir zum Auslesen das Package tabulizer. Jetzt gibt es das Package noch nicht auf CRAN (dem offiziellen R-Package-Server), sondern nur auf Github. Kein Problem, denn auch für die einfache Installation von Github-Packages gibt es ein Package, nämlich devtools. Also installieren wir das zuerst und können dann das tabulizer-Package installieren

# benötigte Packages installieren (einmalig)
install.packages("devtools")
library(devtools)
install_github("ropensci/tabulizer")

Und jetzt kann es losgehen:

library(tabulizer)
# Adresse angeben, entweder im Netz
location <- "https://www.deutsche-alzheimer.de/fileadmin/alz/pdf/factsheets/infoblatt1_haeufigkeit_demenzerkrankungen_dalzg.pdf"
# oder lokal auf der Festplatte
#location <- 'C:/Users/Google Drive/Databraineo/Blog/PDF Tabellen auslesen mit R/infoblatt1_haeufigkeit_demenzerkrankungen_dalzg.pdf'
# Alle Tabellen aus pdf auslesen
out <- extract_tables(location,encoding="UTF-8")

Jetzt sind alle Tabellen, die in dem pdf enthalten sind, als Liste ausgelesen. Nun interessiert uns die 2. Tabelle und durch den Seitenumbruch auch noch die 3.

# 2. und 3. Tabelle aus der Liste in einen data.frame zusammenführen
df <- as.data.frame(out[[2]],stringsAsFactors = FALSE)
df <- rbind(df,as.data.frame(out[[3]],stringsAsFactors = FALSE))

Der dataframe ist durch das etwas komische Format noch nicht wirklich brauchbar. Wir nehmen die Spaltennamen und der 1. & 2.Zeile, löschen die überflüssigen Zeilen und entfernen den Dezimalpunkt, den der wird in R als Komma interpretiert.

# säubern
colnames(df)[1] <- df[1,1]
colnames(df)[2:7] <- df[2,2:7]
colnames(df)[1] <- df[1,1]
colnames(df)[2:7] <- df[2,2:7]
df <- df[-c(1,2,10,11),]
# 1000er-Trennpunkt löschen
df[,2:7] <- apply(df[,2:7], 2, function(y) as.numeric(gsub("\\.", "", y)))

Fertig zur Verwendung. Um das Ganze noch eleganter zu machen, überführen wir den dataframe von einem Querdatensatz (jede Spalte eine Variable) in einen Längsdatensatz/Kontenmodell (eine Spalte mit Variablennamen, eine mit dem zugehörigen Wert). Ob man das machen will, hängt einfach von der weiteren Verwendung ab.

#in einen Längs-Datensatz überführen
library(reshape2)
dfLong <- melt(df, id="Bundesland",variable.name="Altersklasse",value.name = "Anzahl")
dfLong <- dfLong[order(dfLong$Bundesland,dfLong$Altersklasse),]

Ich hoffe, ihr konntet was für euch mitnehmen.

Genießt das schöne Wetter heute,
Euer Holger