# --------- Computing with text ------- rm(list = ls()) setwd("S:/SS_2016/Syntax zum Skript") # ---------------------------------------- # 1.1 Text computations # Textverarbeitung ist wichtig # - zur Datenaufbereitung # - zum Arbeiten mit Text-Daten # Typische Aufgaben # sorting, substring searching, pattern matching, data compression # Datenbeispiel: Better Life Index bli <- read.csv2("better-life-index.csv", stringsAsFactors = FALSE) names(bli) summary(bli) str(bli) head(bli) # ---------------------------------------- # 1.2 Character vectors # Strings können mit doppelten oder einfachen Anführungszeichen eingegeben werde t <- c("The quick brown fox", "jumps over the lazy dog") # bevorzugt t2 <- c('The quick brown fox', 'jumps over the lazy dog') # Anführungszeichen innerhalb der Textsequenz t3 <- c('The quick brown fox', 'jumps over the "lazy" dog') t4 <- c("The quick brown fox", "jumps over the 'lazy' dog") ?Quotes # \n newline # \t tab # Länge des Vektors length(t) # Anzahl der Zeichen pro Element nchar(t) # Aneinanderhängen von Text ?paste paste("Today is", date()) paste("Today is", date(), sep = ": ") # paste funktioniert auch vektorisiert paste("A", 1:6, sep = "") # äquivalent paste0("A", 1:6) # Zusammenfügen von Informationen in einem String (Vektor der Länge 1) paste("A", 1:6, collapse=",", sep="") paste(t, collapse = " ") paste(t, collapse = " ... ") #----------- # weitere nützliche Funktionen ?sprintf # formatierte Kombination von Text und Variablenwerten sprintf("%s is %f feet tall\n", "Sven", 7.1) ?tolower # alles in Kleinbuchstaben tolower(t) ?toupper # alles in Großbuchstaben toupper(t) ?strtrim # Text auf eine bestimmte Länge kürzen strtrim(t, c(5,10)) ?strwrap # Wrap Character Strings to Format Paragraphs strwrap(t, width=5) strwrap(t, width=10) strwrap(t, width=2) ?abbreviate # Abkürzen von Strings abbreviate(names.arg=t, minlength = 4) abbreviate(names.arg=t, minlength = 10) abbreviate(names.arg=t, minlength = 2) # ---------------------------------------- # 1.3 Exact string matching # exakte Übereinstimmung von Text ?match # gibt den Index zurück match(c("a","y"), letters) match(c("a", 1), letters) c("a",1) %in% letters # gibt logischen Vektor zurück ?pmatch # Partial String Matching pmatch("med", c("mean", "mode")) pmatch("med", c("mean", "median", "mode")) pmatch("med", c("mean", "median", "mode", "median2")) ?charmatch # Partial String Matching charmatch("med", c("mean", "mode")) charmatch("med", c("mean", "median", "mode")) charmatch("med", c("mean", "median", "mode", "median2")) # Spalten eines Datensatzes identifizieren names(bli) match(c("Housing_Rooms.per.person", "Environment_Air.pollution"), names(bli)) # Prüfen, ob bestimmte Variablen in einem Datensatz enthalten sind match(c("Housing_Rooms.per.person", "Housing_Rooms.per.person_xxx", "Environment_Air.pollution"), names(bli)) ( c("Housing_Rooms.per.person", "Housing_Rooms.per.person_xxx", "Environment_Air.pollution") %in% names(bli) ) # ---------------------------------------- # 1.4 Substrings # Extrahieren oder Ersetzen von Substrings in einem character-Vektor # basierend auf Positionen ?substr # substr(x, start, stop) # Anfangs- und Endposition müssen übergeben werden substr(t, 5, 10) substr(t, 4, 11) substr(t[2], 21, 23) substr(t[2], 21, 23) <- "cat" t # kein recycling substr(t[2], 21, 23) <- "zo" t substr(t[2], 21, 23) <- "zoxx" t # substring(text, first, last = 1000000L) # nur die Anfangsposition muss übergeben werden substring(t[2], 21) substring(t[2], 21) <- "bee" t substring(t[2], 21) <- "zoxx" t # Anwendung auf eine Spalte in einem Datensatz substr(bli$Income_Households.income, start = 1, stop = nchar(bli$Income_Households.income) - 4) Income_Households.income_num <- as.numeric(substr(bli$Income_Households.income, start = 1, stop = nchar(bli$Income_Households.income) - 4)) # ---------------------------------------- # 1.5 Pattern matching # basierend auf Mustern im Text # Regular expressions ?regex #---------------- # Treffer - Index bzw. ja-nein: grep und grepl t2 <- c("Programmieren", "mit", "statistischer", "Software", "SS2012") ?grep # grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, # fixed = FALSE, useBytes = FALSE, invert = FALSE) # grep gibt Index mit Treffern aus grep("a", t2) grep("[[:alpha:]]", t2) grep("[[:digit:]]", t2) # grepl gibt Vektor mit TRUE-FALSE zurück grepl("a", t2) grepl("[[:alpha:]]", t2) grepl("[[:digit:]]", t2) t3 <- c("2012-07-10", "2012-01-20", "May 5, 2012") grep("\\d{4}-\\d{2}-\\d{2}", t3) grepl("\\d{4}-\\d{2}-\\d{2}", t3) #---------------- # Index des Treffers innerhalb jedes Elements ?regexpr # regexpr(pattern, text, ignore.case = FALSE, perl = FALSE, # fixed = FALSE, useBytes = FALSE) regexpr("a", t2) regexpr("[[:alpha:]]", t2) regexpr("[[:digit:]]", t2) gregexpr("a", t2) gregexpr("[[:alpha:]]", t2) gregexpr("[[:digit:]]", t2) #---------------- # Zugriff auf Teile des Musters: sub und gsub # sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, # fixed = FALSE, useBytes = FALSE) sub("(\\d{4})-\\d{2}-\\d{2}", "\\1", t3) sub("(\\d{4})-(\\d{2})-(\\d{2})", "\\3.\\2.\\1", t3) gsub("(\\d{4})-\\d{2}-\\d{2}", "\\1", t3) gsub("(\\d{4})-(\\d{2})-(\\d{2})", "\\3.\\2.\\1", t3) #---------------- # Split the Elements of a Character Vector ?strsplit # strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE) x <- c(as = "asfef", qu = "qwerty", "yuiop[", "b", "stuff.blah.yech") strsplit(x, "e") t4 <- c("89. Derdiyok fuer Schuerrle", "69. Kohr fuer L. Bender") ?regexec m <- regexec("(\\d\\d)\\. (.+) fuer (.+)", t4) ?regmatches # Extract or Replace Matched Substrings regmatches(t4, m) #---------------- # Anwendung auf einen Datensatz # Index der Variablennamen, die Muster enthalten grep("Income_", names(bli)) # Extraktion der Zahlen (digits) sub("(\\d+) .+", "\\1", bli$Income_Households.income) # ---------------------------------------- # 1.6 Data analysis satisfaction <- data.frame( letter = substr(bli$COUNTRY, 1, 1), value = as.numeric( sub("(.+) rate", "\\1", bli$Life.Satisfaction_Life.Satisfaction))) satisfaction barplot(sapply(split(satisfaction$value, satisfaction$letter), mean)) #----------------------------------------- # Objekt mit Nummer der Iteration im Namen for(i in 1:3){ name <- paste0("res",i) assign(name,i) } res1 res2 res3