This example shows how to use the kth_school_dep() function to enumerate some organizational unit “slugs”.

For these slugs, associated KTH employees with the word “HEAD” in their titles are listed.

This creates a list of potentially responsible heads for this set of organizational units at KTH.

For most units there are several potential matches.

library(kthapi)
library(dplyr)
library(stringr)
library(purrr)
#> 
#> Attaching package: 'purrr'
#> The following object is masked from 'package:kthapi':
#> 
#>     flatten
#> The following object is masked from 'package:testthat':
#> 
#>     is_null
library(tibble)

# some slugs of relevance
slugs <- 
  kth_school_dep() %>% 
  # we look for schools (ie slugs containing a slash character)
  mutate(is_dep = stringr::str_detect(slug, "/")) %>% 
  # we exclude t, vg, zaa and m/m slugs ()
  mutate(is_excluded = stringr::str_detect(slug, "t/|vg/|zaa/|m/m")) %>%
  # retain just the deps and non-excluded slugs
  filter(is_dep, !is_excluded) %>% 
  pull(slug)

slugs <- setNames(nm = slugs)

# a function to flag potential heads (containing the word HEAD in the english descr)
dep_heads <- function(slug)
  kth_catalog(slug = slug)$users %>% 
  mutate(is_head = grepl("HEAD", `title.en`)) %>%
  filter(is_head)
  
# iterate over all slugs to locate potential heads
potential_heads <- 
  slugs %>% purrr::map_dfr(dep_heads, .id = "slug")

# display some of the results
display <- 
  potential_heads %>% 
  select(slug, username, title = `title.en`) %>%
  inner_join(kth_school_dep()) %>%
  select(slug, slug_id = kthid, desc = `description.en`, username, title)
#> Joining, by = "slug"

display <- 
  display %>% 
  slice(sample(nrow(display), size = 5))

knitr::kable(display)
slug slug_id desc username title
j/jr u22y13wv DEPARTMENT OF INTELLIGENT SYSTEMS mikaelj PROF., DEPUTY HEAD OF DIVISION
c/cg u2hmae9o DEPARTMENT OF FIBRE AND POLYMER TECHNOLOGY monicaek PROFESSOR, HEAD OF DIVISION
a/al u23cj6w6 SUSTAINABLE DEVELOPMENT, ENVIRONMENTAL SCIENCE AND ENGINEERING malmstro HEAD OF DEPARTMENT, ASSOC.PROF
j/jj u24u5kih DEPARTMENT OF ELECTRICAL ENERGY ENGINEERING mnorgren PROFESSOR, HEAD OF DIVISION
a/aab u2zd9bd6 SCHOOLS OFFICE OF STUDENT AFFAIRS ABE tiinav HEAD OF STUDENT COUNSELOR

# for each potential head, additional info can be looked up, like this:
kth_profile_legacy(display$username[1])$content %>% 
  select(url, worksfor = `worksFor.url`) %>%
  glimpse()
#> Rows: 1
#> Columns: 2
#> $ url      <chr> "https://www.kth.se/profile/mikaelj"
#> $ worksfor <chr> "https://www.kth.se/directory/j/jr/jrl"

Division level data

What divisions (KTH -> School -> Department (sv: Institution) -> Division (sv: Avdelning)) are there?


# get some relevant schools and departments
ksd <- 
  kth_school_dep()  %>% 
  mutate(is_excluded = ifelse(nchar(stringr::str_match(slug, "t|vg|zaa")) > 0, TRUE, FALSE)) %>%
  # retain just the deps and non-excluded slugs
  filter(is.na(is_excluded)) %>% 
  arrange(-desc(slug)) %>% 
  select(slug, desc = `description.en`)

knitr::kable(ksd %>% slice(1:5))
slug desc
a SCHOOL OF ARCHITECTURE AND THE BUILT ENVIRONMENT
a/aaa SCHOOLS OFFICE
a/aab SCHOOLS OFFICE OF STUDENT AFFAIRS ABE
a/abe ABE SKOLAN
a/acp VIABLE CITIES

# use one of the slugs

ai <- 
  kth_catalog(slug = "a/ai")

# users can now be enumerated, for example:
#knitr::kable(ai$users %>% slice(1:5))

# divisions can be enumerated for each of the departments, for example:

ai$catalog %>% 
  select(slug, `description.en`, kthid) %>%
  knitr::kable()
slug description.en kthid
a/ai/aia DIVISION OF REAL ESTATE AND CONSTRUCTION MANAGEMENT u2n3dep0
a/ai/aib DIVISION OF REAL ESTATE ECONOMICS AND FINANCE u2vce7hj
a/ai/aic DIVISION OF REAL ESTATE PLANNING AND LAND LAW u2yhezo5
a/ai/aid DIVISION OF CONSTRUCTION AND FACILITIES MANAGEMENT u2ctw8g8
a/ai/aie DIVISION OF REAL ESTATE BUSINESS AND FINANCIAL SYSTEMS u21evul2
a/ai/aig DIVISION OF GEODESY AND SATELLITE POSITIONING u21ttfwm