Práce s vektorem znakových řetězců
Znalost práce s vektory řetězců
Vektor znakových rětězců je vektor typu "character" - tedy jeho jednotlivé prvky jsou řetězce znaků (syn. text, textový řetězec). Řetězec znaků je také vektorem o délce 1.
> p <- "Muj oblibeny napoj je pivo" # řetězec znaků (vektor o délce 1)
> r <- c ("Muj", "oblibeny", "napoj", "je", "vino") # vektor znakových řetězců (o délce 5)
Počet znaků řetězce se dá zjistit funkcí nchar(), která je podobně jako jiné funkce v R vektorizována (aplikuje se tedy na všechny prvky vektoru):
> nchar(p)
[1] 26
> nchar(r)
[1] 3 8 5 2 4
Chceme-li vyměnit část znaků v samotném textovém řetězci, aplikujeme funkci sub(). Nahraďme v textovém řetězci p slovo "pivo" slovem "voda".
> sub("pivo", "voda", p)
[1] "Muj oblibeny napoj je voda"
Chceme-li spojit několik textových řetězců do jednoho, použijeme funkci paste(). Do této funkce můžeme každý řetězec zadat jako samostatný parametr:
> paste("Muj", "oblibeny", "napoj", "je", "vino", collapse = "")
[1] "Muj oblibeny napoj je vino"
nebo můžeme zadat vektor textových řetězců
> paste(r, collapse = "")
[1] "Muj oblibeny napoj je vino"
Vytvořme si další textový řetězec:
> p2 <- c("Muj;oblibeny;napoj;je;pivo" )
Pro rozdělení textového řetězce na vektor jednotlivých prvků použijeme vektorizovanou funkci strsplit(), kde parametr split= určuje znak řetězce, který slouží jako oddělovač. Mezera je také znak:
> strsplit(p, split=' ')
[[1]]
[1] "Muj" "oblibeny" "napoj" "je" "pivo"
V textovém řetězci p2 odděluje jednotlivá slova středník
> strsplit(p2, split=";")
[[1]]
[1] "Muj" "oblibeny" "napoj" "je" "pivo"
Použijeme-li jako oddělovač pouze apostrofy bez mezery, řetězec bude rozdělen na vektor jednotlivých znaků:
> strsplit(p, split='')
[[1]]
[1] "M" "u" "j" " " "o" "b" "l" "i" "b" "e" "n" "y" " " "n" "a" "p" "o" "j" " " "j" "e" " " "p"
[24] "i" "v" "o"
Vektorizovaná funkce substring() vrací část řetězce
> substring(p, first=1,last=2)
[1] "Mu"
Vyhledávání ve znakovém řetězci s použitím regexpr() funkce, která vrátí první pozici hledaného řetězce a jeho délku, přičemž -1 znamená, že daný řetězec se nenašel. V případě, že se hledaný řetězec vyskytuje v řetězci více než jednou, funkce vrátí pouze první pozici.
> regexpr ("oblibeny", p)
[1] 5
attr(,"match.length")
[1] 8
attr(,"useBytes")
[1] TRUE
> regexpr ("j", p)
[1] 3
attr(,"match.length")
[1] 1
attr(,"useBytes")
[1] TRUE
> regexpr ("oj", r)
[1] -1 -1 4 -1 -1
attr(,"match.length")
[1] -1 -1 2 -1 -1
attr(,"useBytes")
[1] TRUE
Úlohy k procvičení
> s = c("8 jablek" , "10 hrusek" )
1. Spojte objekty vektoru řetězců znaků q tak aby byly slova oddělená znakem /
> strsplit(r, '')
3. Vytvořte z vektorů p, s a r vektor v = c ("pivo", "vino", "jablek", "hrušek")