if (!require("pacman")) install.packages("pacman")
::p_load(
pacman# file management
here, qs, # data wrangling
magrittr, janitor, # data analysis
easystats, sjmisc, # visualization
ggpubr,
openalexR, # load last to avoid masking issues
tidyverse )
API mining and data wrangling with R
Session 07 - Exercise
In folgenden Übungsaufgaben dienen dazu, die Datengrundlage für die in den nächsten Sitzungen anstehende(n) Textanalyse(n) weiter inhaltlich plausibel einzugrenzen bzw. zu präzisieren.
Finales Ziel ist die Erstellung eines Code-Chunks, mit dessen Hilfe der Datensatz review_subsample erstellt werden soll. Bitte arbeitet die Übung durch, wir besprechen zu Anfang der nächsten Sitzung dann eure Vorschläge.
Background
OpenAlex is a free and open catalog of the global research system. It’s named after the ancient Library of Alexandria and made by the nonprofit OurResearch.
At the heart of OpenAlex is our dataset—a catalog of works. A work is any sort of scholarly output. A research article is one kind of work, but there are others such as datasets, books, and dissertations. We keep track of these works—their titles (and abstracts and full text in many cases), when they were created, etc. But that’s not all we do. We also keep track of the connections between these works, finding associations through things like journals, authors, institutional affiliations, citations, topics, and funders. There are hundreds of millions of works out there, and tens of thousands more being created every day, so it’s important that we have these relationships to help us make sense of research at a large scale.
Preparation
- Bitte stellen Sie sicher, dass Sie das jeweilige R-Studio Projekt zur Übung geöffnet haben. Nur so funktionieren alle Dependencies korrekt.
- Um den einwandfreien Ablauf der Übung zu gewährleisten, wird für die Aufgaben auf eine eigenständige Datenerhebung verzichtet und ein Übungsdatensatz zu verfügung gestelt.
Packages
Zum Laden der Pakete wird das Paket
pacman::pload()
genutzt, dass gegenüber der herkömmlichen Methode mitlibrary()
eine Reihe an Vorteile hat:- Prägnante Syntax
- Automatische Installation (wenn Paket noch nicht vorhanden)
- Laden mehrerer Pakete auf einmal
- Automatische Suche nach
dependencies
Import und Vorverarbeitung der Daten
# Import from local
<- qs::qread(here("data/session-07/openalex-review_works-2013_2023.qs"))
review_works
# Create correct data
<- review_works %>%
review_works_correct mutate(
# Create additional factor variables
publication_year_fct = as.factor(publication_year),
type_fct = as.factor(type)
)
🛠️ Praktische Anwendung
- Bevor Sie mit der Arbeit an den folgenden 📋 Exercises beginnen, stellen Sie bitte sicher, dass Sie alle Chunks des Abschnitts Preparation gerendert haben. Das können Sie tun, indem Sie den “Run all chunks above”-Knopf
des nächsten Chunks benutzen.
- Bei Fragen zum Code lohnt sich ein Blick in den Showcase (.qmd oder .html). Beim Showcase handelt es sich um eine kompakte Darstellung des in der Präsentation verwenden R-Codes. Sie können das Showcase also nutzen, um sich die Code-Bausteine anzusehen, die für die R-Outputs auf den Slides benutzt wurden.
📋 Exercise 1: Sprache der Publikationen
- Identifizieren Sie die für die Untersuchung relevanten Artikel auf Basis von deren Sprache (
language
) - Hintergrundinformation zur Variable
language
finden Sie in der API-Dokumentation von OpenAlex.
- Nutzen Sie die Funktion
sjmisc::frq()
und schauen Sie sich im Datensatzreview_works_correct
die Variablenlanguage
an. Verwenden Sie das Argumentsort.frq = "desc"
, um die Häufigkeit der Sprachen absteigend zu sortieren. - Notieren Sie sich den jeweilgen ISO 639-1 language code, um Ihn später bei 📋 Exercise 4: Erstellung Subsample als Filter zu nutzen.
Lösung anzeigen
%>%
review_works_correct ::frq("language", sort.frq = "desc") sjmisc
language <character>
# total N=93655 valid N=93476 mean=10.33 sd=2.27
Value | N | Raw % | Valid % | Cum. %
----------------------------------------
en | 90653 | 96.79 | 96.98 | 96.98
id | 1118 | 1.19 | 1.20 | 98.18
pt | 521 | 0.56 | 0.56 | 98.73
es | 309 | 0.33 | 0.33 | 99.06
tr | 182 | 0.19 | 0.19 | 99.26
ko | 130 | 0.14 | 0.14 | 99.40
fr | 127 | 0.14 | 0.14 | 99.53
ru | 72 | 0.08 | 0.08 | 99.61
de | 59 | 0.06 | 0.06 | 99.67
it | 43 | 0.05 | 0.05 | 99.72
pl | 36 | 0.04 | 0.04 | 99.76
fa | 20 | 0.02 | 0.02 | 99.78
ro | 20 | 0.02 | 0.02 | 99.80
ja | 19 | 0.02 | 0.02 | 99.82
ca | 16 | 0.02 | 0.02 | 99.84
uk | 16 | 0.02 | 0.02 | 99.86
ar | 15 | 0.02 | 0.02 | 99.87
th | 14 | 0.01 | 0.01 | 99.89
nl | 13 | 0.01 | 0.01 | 99.90
sv | 13 | 0.01 | 0.01 | 99.91
hr | 11 | 0.01 | 0.01 | 99.93
hu | 11 | 0.01 | 0.01 | 99.94
sl | 10 | 0.01 | 0.01 | 99.95
af | 8 | 0.01 | 0.01 | 99.96
cs | 6 | 0.01 | 0.01 | 99.96
da | 5 | 0.01 | 0.01 | 99.97
el | 5 | 0.01 | 0.01 | 99.97
bg | 4 | 0.00 | 0.00 | 99.98
zh-cn | 4 | 0.00 | 0.00 | 99.98
et | 3 | 0.00 | 0.00 | 99.99
lt | 3 | 0.00 | 0.00 | 99.99
fi | 2 | 0.00 | 0.00 | 99.99
mk | 2 | 0.00 | 0.00 | 99.99
no | 2 | 0.00 | 0.00 | 100.00
ta | 2 | 0.00 | 0.00 | 100.00
cy | 1 | 0.00 | 0.00 | 100.00
hi | 1 | 0.00 | 0.00 | 100.00
<NA> | 179 | 0.19 | <NA> | <NA>
Lösung anzeigen
# Notiz(en)
# - Überwiegende Anzahl der heruntergeladenen Datenbankbeiträge ist in englischer Sprache (en) verfasst.
# -Die Sprache en wird als Filterkriterium für die Erstellung des Subsamples genutzt, auch um spätere Probleme bei der Analyse durch multi-linguale Texte zu vermeiden.
📋 Exercise 2: Typ der Publikationen
- Identifizieren Sie die für die Untersuchung relevanten Artikel auf Basis deres Typen (
type
). - Hintergrundinformation zur Variable
type
finden Sie in der API-Dokumentation von OpenAlex.
- Nutzen Sie die Funktion
sjmisc::frq()
und schauen Sie sich im Datensatzreview_works_correct
die Variablentype
an. Verwenden Sie das Argumentsort.frq = "desc"
, um die Typen in Abhängigkeit Ihrer Häufigkeit absteigend zu sortieren. - Notieren Sie sich die Ausprägungen der Variable type, die aus Ihrer Sicht später bei 📋 Exercise 4: Erstellung Subsample als Filter genutzt werden soll.
Lösung anzeigen
%>%
review_works_correct ::frq("type", sort.frq = "desc") sjmisc
type <character>
# total N=93655 valid N=93655 mean=3.09 sd=4.64
Value | N | Raw % | Valid % | Cum. %
----------------------------------------------------------
article | 73716 | 78.71 | 78.71 | 78.71
review | 6437 | 6.87 | 6.87 | 85.58
preprint | 3570 | 3.81 | 3.81 | 89.40
book-chapter | 2860 | 3.05 | 3.05 | 92.45
libguides | 2414 | 2.58 | 2.58 | 95.03
dataset | 1471 | 1.57 | 1.57 | 96.60
peer-review | 1400 | 1.49 | 1.49 | 98.09
dissertation | 975 | 1.04 | 1.04 | 99.13
report | 422 | 0.45 | 0.45 | 99.58
book | 167 | 0.18 | 0.18 | 99.76
other | 64 | 0.07 | 0.07 | 99.83
paratext | 57 | 0.06 | 0.06 | 99.89
erratum | 47 | 0.05 | 0.05 | 99.94
letter | 25 | 0.03 | 0.03 | 99.97
editorial | 17 | 0.02 | 0.02 | 99.99
supplementary-materials | 7 | 0.01 | 0.01 | 99.99
reference-entry | 6 | 0.01 | 0.01 | 100.00
<NA> | 0 | 0.00 | <NA> | <NA>
Lösung anzeigen
# Notiz(en)
# - Überwiegende Anzahl der heruntergeladenen Datenbankbeiträge sind `article.`
# - Die folgenden Auswertungen beziehen sich auf die Publikationen des Typs article, da uns besonders die praktische Anwendung/Umsetzung der Methode in verschiedenen Kontexten interessiert. Läge der Fokus auf (die Entwicklung) der Methode selbst, wäre vermutlich eher die Typen book oder book-chapter relevant.
📋 Exercise 3: Forschungsfeld der Publikationen
Identifizieren Sie die für die Untersuchung relevanten Artikel auf Basis des von OpenAlex dem Artikel zugeordnenten Foschungsfeldes (
field)
)Hintergrundinformation zur Variable
field
finden Sie in der API-Dokumentation von OpenAlex.
- Basierend auf dem Datensatz
review_works_correct
- nutzen Sie die Funktion
unnest()
um die Variablen dertopics
-Liste zu extrahieren. Verwenden Sie dabei das Argumentnames_sep = "_"
. um doppelte Variablennamen durch Hinzufügen des Prefixestopics_
zu verhindern. - filtern Sie anschließen mit Hilfe der Funktion
filter
und der Variable bzw. dem Argumenttopics_name == "field"
nur die Informationen zum Forschungsfeld, sowie mit der Variable bzw. dem Argumenttopics_i == "1"
nur die erste Zuordnung. - Nutzen Sie die Funktion
sjmisc::frq()
und schauen Sie sich die Variablentopics_display_name
an. Verwenden Sie das Argumentsort.frq = "desc"
, um die Forschungsfelder in Abhängigkeit Ihrer Häufigkeit absteigend zu sortieren.
- nutzen Sie die Funktion
- Notieren Sie sich die Ausprägungen der Variable topics_display_name, die aus Ihrer Sicht später bei 📋 Exercise 4: Erstellung Subsample als Filter genutzt werden soll.
Lösung anzeigen
%>%
review_works_correct unnest(topics, names_sep = "_") %>%
filter(topics_name == "field") %>%
filter(topics_i == "1") %>%
::frq("topics_display_name", sort.frq = "desc") sjmisc
topics_display_name <character>
# total N=93655 valid N=93655 mean=4.41 sd=1.62
Value | N | Raw % | Valid % | Cum. %
----------------------------------------------------------------------
Social Sciences | 30580 | 32.65 | 32.65 | 32.65
Psychology | 29054 | 31.02 | 31.02 | 63.67
Business, Management and Accounting | 15558 | 16.61 | 16.61 | 80.29
Decision Sciences | 7261 | 7.75 | 7.75 | 88.04
Economics, Econometrics and Finance | 6796 | 7.26 | 7.26 | 95.30
Arts and Humanities | 4406 | 4.70 | 4.70 | 100.00
<NA> | 0 | 0.00 | <NA> | <NA>
Lösung anzeigen
# Notiz(en)
# - Focus auf "primäre" Forschungsfelder `Social Sciences` & `Psychology`
📋 Exercise 4: Erstellung Subsample
- Erstellung sie den Datensatz
review_subsample
, in dem Sie mit Hilfe der Funktionenselect()
und/oderfilter()
das Datenmaterial weiter eingrenzen. Sie können sich sowohl auf die Variablen aus der Übung, als auch auf die aus der Sitzung (bzw. den Slides) beziehen. - Der Code dieses Chunks wird in der nächsten Sitzung benötigt bzw. besprochen, halten Sie diesen deshalb bitte bereit.
Lösung anzeigen
<- review_works_correct %>%
review_subsample filter(language == "en") %>% # nur englischsprachige Einträge
filter(type == "article") %>% # nur Artikel
# Datentranformation
unnest(topics, names_sep = "_") %>%
filter(topics_name == "field") %>%
filter(topics_i == "1") %>%
filter(
== "Social Sciences"|
topics_display_name == "Psychology"
topics_display_name %>%
) glimpse()
Rows: 45,221
Columns: 45
$ id <chr> "https://openalex.org/W4293003987", "https…
$ title <chr> "The WHO-5 Well-Being Index: A Systematic …
$ display_name <chr> "The WHO-5 Well-Being Index: A Systematic …
$ author <list> [<data.frame[4 x 12]>], [<data.frame[2 x …
$ ab <chr> "The 5-item World Health Organization Well…
$ publication_date <chr> "2015-01-01", "2017-08-28", "2014-01-01", …
$ relevance_score <dbl> 938.7603, 752.3500, 591.2553, 576.1210, 56…
$ so <chr> "Psychotherapy and psychosomatics", "Journ…
$ so_id <chr> "https://openalex.org/S184803288", "https:…
$ host_organization <chr> "Karger Publishers", "SAGE Publishing", NA…
$ issn_l <chr> "0033-3190", "0739-456X", NA, "2214-7829",…
$ url <chr> "https://doi.org/10.1159/000376585", "http…
$ pdf_url <chr> "https://www.karger.com/Article/Pdf/376585…
$ license <chr> "cc-by-nc", NA, NA, "cc-by", NA, NA, "cc-b…
$ version <chr> "publishedVersion", NA, "publishedVersion"…
$ first_page <chr> "167", "93", NA, "89", "55", "2150", "e356…
$ last_page <chr> "176", "112", NA, "106", "64", "2159", "e3…
$ volume <chr> "84", "39", NA, "6", "277", "32", "2", "24…
$ issue <chr> "3", "1", NA, NA, NA, "19", "8", NA, "9", …
$ is_oa <lgl> TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE…
$ is_oa_anywhere <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE,…
$ oa_status <chr> "hybrid", "green", "bronze", "gold", "bron…
$ oa_url <chr> "https://www.karger.com/Article/Pdf/376585…
$ any_repository_has_fulltext <lgl> FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE…
$ language <chr> "en", "en", "en", "en", "en", "en", "en", …
$ grants <list> NA, NA, NA, <"https://openalex.org/F43203…
$ cited_by_count <int> 2657, 1375, 2568, 803, 3664, 1553, 2895, 9…
$ counts_by_year <list> [<data.frame[11 x 2]>], [<data.frame[7 x …
$ publication_year <int> 2015, 2017, 2014, 2016, 2020, 2014, 2017, …
$ cited_by_api_url <chr> "https://api.openalex.org/works?filter=cit…
$ ids <list> <"https://openalex.org/W4293003987", "htt…
$ doi <chr> "https://doi.org/10.1159/000376585", "http…
$ type <chr> "article", "article", "article", "article"…
$ referenced_works <list> <"https://openalex.org/W1492518593", "htt…
$ related_works <list> <"https://openalex.org/W3020194755", "htt…
$ is_paratext <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, …
$ is_retracted <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, …
$ concepts <list> [<data.frame[7 x 5]>], [<data.frame[18 x …
$ topics_i <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ topics_score <dbl> 0.9926, 0.9050, 0.9995, 0.9987, 0.9999, 1.…
$ topics_name <chr> "field", "field", "field", "field", "field…
$ topics_id <chr> "https://openalex.org/fields/32", "https:/…
$ topics_display_name <chr> "Psychology", "Social Sciences", "Psycholo…
$ publication_year_fct <fct> 2015, 2017, 2014, 2016, 2020, 2014, 2017, …
$ type_fct <fct> article, article, article, article, articl…