Programmering i R

Föreläsning 8: Texthantering, tidyr och dplyr

Mans Magnusson

Avdelningen för statistik, Linköpings universitet

Dagens föreläsning:

  • Inför tentamen
  • Texthantering
  • Databearbetning med dplyr, tidyr och piping

Interaktiv återkoppling

Inför tentamen

  • Tenta i datorsal 08.00-12.00
  • Tentan kommer likna de gamla tentorna, som ni hittar [här], det finns lösningar till dessa
  • Hjälpmedel:
    • Den inbyggda hjälpen i R (ej internet)
    • Samtliga “fusklappar” som finns på Github

Inför tentamen

  • Tenta, “fusklappar” och eventualla dataset kommer ni att få tillgång till elektroniskt (ta inte med några papper)
  • Vid tentan kommer ni få ett specifikt användarnamn och lösenord som ni använder för att logga in.
  • OBS: använd ej vanliga liuid och lösenord!
  • Tentan är anonym
  • Se här för allmänna instruktioner för datortentor i PC-pularna.

Texthantering i R

Arbeta med strängar

  • Sträng (eng. string): en samling bokstäver (characters)
  • Centralt är regular expressions (regex)
  • Identifiera/matcha text eller delar av text (tänk sökfunktion)
  • Med pattern syftas regular expressions i R

Arbeta med strängar II

  • I R finns ett antal förinstallerade funktioner (i paketet base) för att hantera text
    • ex. paste(), substr(), nchar()
  • Men vi använder framförallt paketet stringr
    • Enklare
    • Enhetligt

Arbeta med strängar II

  • readLines(con=,encoding=) kan användas för att läsa in en text. Varje rad i texten blir då ett element i en vektor.

  • Icke-engelska symboler/tecken text kräver encoding (ex. för å,ä och ö).

  • Vi ändrar med encoding = "latin1" i readLines().

  • Vanligast är latin1 och UTF8 (men Windows can ha egna encodings)

Paketet stringr

  • Ett paket med vektoriserade funktioner
    • Samtliga funktioner börjar med str_
  • Se artikeln för detaljer om stringr

Funktioner

Grundläggande strängfunktioner

stringr base Användning
str_sub() substr() substring, välja ut en del av en sträng
str_c() paste() slår ihop strängelement
str_split() strsplit() dela upp en sträng i flera element
str_length() nchar() beräknar antalet tecken
str_trim() - tar bort mellanslag (före/efter textelement)
str_pad() - lägger till mellanslag (före/efter textelement)

Pattern matching

regular expression (regexp)

  • Hitta specifika delar av en sträng som uppfyller ett villkor
  • Byggs upp av:
    • literals: “vanliga bokstäver och siffror”
    • metacharacters: (metatecken) sätter upp speciella regler för matchning
  • Se RP:s video:
    • Regular Expressions
    • Introduction to the Baltimore Homicide Data
    • Regular Expressions in R

regular expression: metacharacters

Tecken Betydelse
. samtliga tecken (exkl. det “tomma” tecknet “”)
^ det “tomma” tecknet i början av en text
$ det “tomma” tecknet i slutet text
* föregående tecken 0 eller fler gånger
+ föregående tecken 1 eller fler gånger
? föregående tecken är valfritt
{n,m} föregående tecken \( n \) eller max \( m \)
[] teckenlista (character list)
\( | \) ELLER
() Gruppering
\ Används för att identifiera metatecken/specialtecken

regular expression: teckenklass

  • Med [ ] skapas en lista över tänkbara tecken, en s.k. teckenklass (eng. character class)
  • Används för att identifiera en mängd av tecken
  • Inom [ ] har bara följande meta-tecken en särskild betydelse:
Tecken Betydelse Exempel
- tecken A-Z a-z 0-9
^ ICKE 0-9
\ specialtecken \t\n

regular expression: teckenklass

Vanliga fördefinierade klasser är… (kolla ?regexp)

  • [:digit:] Nummer
  • [:lower:] gemener
  • [:upper:] VERSALER
  • [:punct:] tecken, ej bokstäver eller siffror
  • [:space:] mellanslag, tab, ny rad m.m.

regular expression: länkar

Pattern matchingfunktioner i R

  • pattern är ett regular expression
stringr base Användning
str_detect() grepl() identifierar pattern, returnerar en logisk vektor
str_locate() gregexpr() identifierar pattern, returnerar positionen i texten
str_replace() gsub() identifierar pattern, och ersätter detta med ny text
str_extract_all - Plocka ut alla strängar som uppfyller pattern
  • För exempel på några av dessa funktioner kolla på Roger Pengs video

regular expression: demo

Modern databearbetning

Varför tala om detta?

  • Datamängder blir bara större och större
  • Smart hantering minskar arbetsbördan
  • Smart hantering gör bearbetning snabb
  • Skriv kod för människor (med pipes)

piping

z <- a %>% 
  fun1(b) %>% 
  fun3()

är detsamma som

x <- fun(a, b) 
z <- fun3(x)

tidy data

messy data %>% 
  tidy data %>% 
  analys

tidyr: Tidy data

  • Varje kolumn en variabel
  • Varje rad en observation

tidyr

  • Paket i R för att konvertera 'messy data' till 'tidy' data
  • Effektivt programmerat
    • Minnesmässigt
    • Beräkningsmässigt
  • Kommer bespara er mycket tid

tidyr exempel: demo

dplyr

  • Paket i R för att hantera stora datamängder
  • En liten uppsättning s.k. verb (funktioner) för datahantering
  • Optimerad C++ kod för snabb och minneseffektiv hantering
  • Går att koppla till databaser och Spark
  • Lägger på klassen tbl_df till data.frame

dplyr verb

verb beskrivning
select() välj kolumn
filter() filtrera rader
arrange() arrangera rader
mutate() skapa nya kolumner
summarise() aggregera rader över grupp
group_by() gruppera för “split-apply-combine”/aggregera
join kombindera olika dataset

dplyr exempel: demo