Dienstag, 20. Januar 2009

Zeichenfunktionen

nchar
Count the number of characters, also auch Länge eines Strings:

> nchar( c("Lorem", "ipsum") )
[1] 5 5


tolower/toupper
Gross-/Kleinschreibung

> tolower( LETTERS[1:8] )
[1] "a" "b" "c" "d" "e" "f" "g" "h"
> toupper( letters[1:8] )
[1] "A" "B" "C" "D" "E" "F" "G" "H"



match
Positionen (Index) von Elementen in einer Liste finden sich mit match.

> match(c("d","p"),letters)
[1] 4 16


grep
suchen von Ausdrücken in einem Vektor, retourniert die Indizes der Elemente, in denen der Ausdruck vorkommt

> x <- c("This"," is a Andri 1,2"," and 3 * test sentence")
> grep(pattern="A",x=x)
[1] 2



regexpr
suchen von Ausdrücken in einem Vektor, retourniert pro Element die ERSTE Position des Vorkommens (-1 für nicht vorhanden) und die Länge der Übereinstimmung

> x <- c("This"," is a Andri 1,2"," and 3 * test sentence")
> regexpr(pattern="i",text=x)
[1] 3 2 -1
attr(,"match.length")
[1] 1 1 -1


gregexpr
suchen von Ausdrücken in einem Vektor,
retourniert pro Element ALLE Positionen und die Länge der Übereinstimmung

> x <- c("This"," is a Andri 1,2"," and 3 * test sentence")
> gregexpr(pattern="i",text=x)
[[1]]
[1] 3
attr(,"match.length")
[1] 1

[[2]]
[1] 2 11
attr(,"match.length")
[1] 1 1

[[3]]
[1] -1
attr(,"match.length")
[1] -1


sub
Ersetzt das ERSTE Vorkommen von pattern in einer Zeichenkette

> x <- c("This"," is a Andri 1,2"," and 3 * test sentence")
> sub(pattern="i", replacement="III", x=x)
[1] "ThIIIs" " IIIs a Andri 1,2" " and 3 * test sentence"


gsub
Ersetzt ALLE Vorkommen von pattern in einer Zeichenkette

> x <- c("This"," is a Andri 1,2"," and 3 * test sentence")
> gsub(pattern="i", replacement="III", x=x)
[1] "ThIIIs" " IIIs a AndrIII 1,2" " and 3 * test sentence"



substr
Teile eines Strings extrahieren (oder ersetzen, letzteres aber besser mit (g)sub):

> substr( x="Lorem ipsum dolor sit amet", start=7, stop=500 )
[1] "ipsum dolor sit amet"

substr( x<-"Lorem ipsum dolor sit amet", start=nchar(x)-3, stop=nchar(x) )


left, right und mid
Die guten alten BASIC-Zeichen-Funktionen mit regular expressions in Funktionen umgesetzt:

left <- function(x, n) {
# x...string, n...Anzahl Zeichen
sub( pattern=paste(".{",nchar(x)-n,"}$", sep=""), replacement="", x=x)
}
right <- function(x, n) {
sub( pattern=paste("^.{",nchar(x)-n,"}", sep=""), replacement="", x=x)
}
mid <- function(x, pos, n) {
x <- sub( pattern=paste("^.{",pos-1,"}", sep=""), replacement="", x=x)
x <- sub( pattern=paste(".{",nchar(x)-n,"}$", sep=""), replacement="", x=x)
return(x)
}


trim
Leerzeichen vor und hinter dem Text entfernen

sub(" *([^ ]+) *", "\\1", x) does not work..  where had I that from?

gsub( pattern="^ +| +$", replacement="", x=" trim links und rechts ")

oder wenn auch Tabulatoren gelöscht werden sollen:
gsub( pattern="^[ \t]+|[ \t]+$", replacement="", x=" trim links und rechts ")


Beispiel
Alle Vektorelemente, die eine Zahl enthalten:

> x[1] "This" " is a Andri 1,2" " and 3 * test sentence"
> x[ as.matrix( regexpr(pattern="[[:digit:]]",text=x) )>0 ]
[1] " is a Andri 1,2" " and 3 * test sentence"


paste
Spaltenweises Verbinden von Spalten eines data.frames:

do.call("paste", c(data.frame(letters, LETTERS), list(sep="/")))

[1] "a/A" "b/B" "c/C" "d/D" "e/E" "f/F" "g/G" "h/H" "i/I" "j/J" "k/K" "l/L" "m/M" "n/N" "o/O" "p/P" "q/Q" "r/R"[19] "s/S" "t/T" "u/U" "v/V" "w/W" "x/X" "y/Y" "z/Z"




und warum nicht direkt (?):  :-o
apply( data.frame(letters, LETTERS), 1, paste, collapse="/" )


und warum nicht nocht direkter (???):  :-o :-o :-o
data.frame(letters, LETTERS, paste(letters, LETTERS, sep="/"))








Keine Kommentare: