Programmering i R

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

Mans Magnusson

STIMA, Linköpings universitet

2018-03-21

Dagens föreläsning:

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

Inför tentamen

  • Tenta i datorsal
  • 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
    • markmyassignment (om allt fungerar som det ska)

Inför tentamen

  • Tenta, “fusklappar” och eventualla dataset kommer ni att få tillgång till elektroniskt (ta inte med några papper)
  • Se länkarna nedan för info om tentan:
  • Tentan är anonym
  • Endast anmälda studenter bereds plats på tentamen.

Texthantering i R

Arbeta med strängar

  • Sträng (eng. string): en samling bokstäver (characters)
  • 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

Strängfunktioner

Grundläggande strängfunktioner

stringr base Användning
str_sub() substr() substring, välja ut en del av en sträng (regex)
str_c() paste() slår ihop strängelement
str_split() strsplit() dela upp en sträng i flera element (regex)
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)

In computing, regular expressions provide a concise and flexible means for identifying strings of text of interest, such as particular characters, words, or patterns of characters.

  • 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, Regular Expressions in R
  • Tips! Regexp Golf: https://alf.nu/RegexGolf
  • Testa: https://regex101.com/

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)
$ $
(...) Gruppering
\ Används för att “undvika” metatecken/specialtecken.

Obs! I R: \\ krävs

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

Obs! I R: \\ krävs

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.

  • I R behöver vi ange att det är en teckenklass: [[:space:]]

regular expression: länkar

Pattern matchingfunktioner i R

  • pattern är ett regular expression i R
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
  • Analysfunktioner kräver ett särskilt format (tidy data).
  • 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
  • Vanliga R jobbar med vektorer, dplyr med data.frames

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
bind_rows kombindera dataset “på höjden”
bind_cols kombindera dataset “på bredden”

dplyr joins

  • Slå ihop data är ofta centralt (merge data)
  • Inom databaser talar man om “joins” (mer senare i DB-kursen)
funktion beskrivning
left_join() slå ihop efter variabel, behåll obs. i vänstra data.frame
right_join() slå ihop efter variabel, behåll obs. i högra data.frame
full_join() slå ihop efter variabel, behåll alla obs.
anti_join() slå ihop efter variabel, behåll obs. som inte finns i båda

dplyr exempel: demo