8.2 Základní operace
8.2.1 Spojení řetězců
Ke spojení více řetězců do jednoho slouží funkce str_c()
. Funkce bere libovolný počet řetězců, vypustí z nich prázdné vektory řetězců a NULL
(ale ne prázdné řetězce ""
) a zbylé neprázdné řetězce spojí je do jednoho vektoru:
library(stringr)
str_c("Jednou", "", "budem", character(0), "možná", NULL, "dál!")
## [1] "Jednoubudemmožnádál!"
Implicitně odděluje jednotlivé řetězce prázdným řetězcem. Oddělovací řetězec je možné nastavit pomocí pojmenovaného parametru sep
:
str_c("Jednou", "", "budem", character(0), "možná", NULL, "dál!", sep = " ")
## [1] "Jednou budem možná dál!"
str_c("Jednou", "", "budem", character(0), "možná", NULL, "dál!", sep = "-")
## [1] "Jednou--budem-možná-dál!"
(Všimněte si, že prázdný řetězec ""
funkce nevypustila.)
Někdy potřebujeme spojit vektory řetězců. Funkce str_c()
spojí odpovídající prvky jednotlivých vektorů (s obvyklou recyklací kratších vektorů, při které funkce vypíše varování) a vrátí vektor:
s1 <- c("a", "b", "c", "d")
s2 <- 1:3 # automatická koerze převede čísla na řetězce
str_c(s1, s2)
## Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
## longer object length is not a multiple of shorter object length
## [1] "a1" "b2" "c3" "d1"
Pokud navíc chceme výsledný vektor spojit do jednoho řetězce, můžeme použít parametr collapse
, kterým se nastavuje vektor, oddělující jednotlivé dílčí vektory (funguje i prázdný řetězec ""
):
str_c(s1, s2, collapse = "-")
## Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
## longer object length is not a multiple of shorter object length
## [1] "a1-b2-c3-d1"
str_c(s1, s2, collapse = "")
## Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
## longer object length is not a multiple of shorter object length
## [1] "a1b2c3d1"
Celkově funguje funkce str_c()
takto: své parametry chápe jako vektory řetězců. Tyto vektory sestaví do matice, kde je každý vstupní vektor tvoří jeden sloupec této matice (přitom prodlouží kratší vektory recyklací jeho prvků). Pak vloží mezi jednotlivé sloupce řetězec sep
a spojí každý řádek do jednoho řetězce, takže výsledkem je jeden (sloupcový) vektor řetězců. Pokud je navíc zadán řetězec collapse
(tj. není NULL
), funkce vloží tento řetězec mezi jednotlivé prvky tohoto vektoru a spojí je do jednoho řetězce.
Takže str_c(s1, s2, sep = "-")
udělá toto:
s1 |
(sep) | s2 |
výsledek |
---|---|---|---|
a | - | 1 | a-1 |
b | - | 2 | b-2 |
c | - | 3 | c-3 |
d | - | 1 | d-1 |
Pokud má kterýkoli řetězec ve spojovaných vektorech hodnotu NA
, pak je výsledné spojení také NA
:
s1 <- c("a", "b", NA)
s2 <- 1:3
str_c(s1, s2)
## [1] "a1" "b2" NA
str_c(s1, s2, collapse = "-")
## [1] NA
Zajímavé příklady z dokumentace funkce:
str_c("Letter: ", letters)
## [1] "Letter: a" "Letter: b" "Letter: c" "Letter: d" "Letter: e"
## [6] "Letter: f" "Letter: g" "Letter: h" "Letter: i" "Letter: j"
## [11] "Letter: k" "Letter: l" "Letter: m" "Letter: n" "Letter: o"
## [16] "Letter: p" "Letter: q" "Letter: r" "Letter: s" "Letter: t"
## [21] "Letter: u" "Letter: v" "Letter: w" "Letter: x" "Letter: y"
## [26] "Letter: z"
str_c("Letter", letters, sep = ": ")
## [1] "Letter: a" "Letter: b" "Letter: c" "Letter: d" "Letter: e"
## [6] "Letter: f" "Letter: g" "Letter: h" "Letter: i" "Letter: j"
## [11] "Letter: k" "Letter: l" "Letter: m" "Letter: n" "Letter: o"
## [16] "Letter: p" "Letter: q" "Letter: r" "Letter: s" "Letter: t"
## [21] "Letter: u" "Letter: v" "Letter: w" "Letter: x" "Letter: y"
## [26] "Letter: z"
str_c(letters[-26], " comes before ", letters[-1])
## [1] "a comes before b" "b comes before c" "c comes before d"
## [4] "d comes before e" "e comes before f" "f comes before g"
## [7] "g comes before h" "h comes before i" "i comes before j"
## [10] "j comes before k" "k comes before l" "l comes before m"
## [13] "m comes before n" "n comes before o" "o comes before p"
## [16] "p comes before q" "q comes before r" "r comes before s"
## [19] "s comes before t" "t comes before u" "u comes before v"
## [22] "v comes before w" "w comes before x" "x comes before y"
## [25] "y comes before z"
str_c(letters, collapse = "")
## [1] "abcdefghijklmnopqrstuvwxyz"
str_c(letters, collapse = ", ")
## [1] "a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z"
8.2.2 Zjištění délky řetězce
Ke zjištění délky řetězce slouží funkce str_length()
, která vrací vektor délek jednotlivých řetězců ve vektoru:
s1 <- "Ahoj!"
s2 <- c("A", "Bb", "Ccc", NA)
str_length(s1)
## [1] 5
str_length(s2)
## [1] 1 2 3 NA
Pozor: funkce length()
nevrací délku řetězce, ale vektoru řetězců. Pamatujte, že R nemá skalár: to, co vypadá jako jeden řetězec, je ve skutečnosti vektor řetězců o délce 1:
length(s1)
## [1] 1
Pozor: technicky vzato vrací funkce str_length()
počet “code points”. Ty většinou odpovídají jednotlivým znakům, ne však vždy. Např. znak á
může být v paměti počítače reprezentován jako jeden znak nebo dva znaky (a
a akcent). Ve druhém případě vrátí funkce str_length()
délku 2. V takovém případě je bezpečnější počítat počet znaků pomocí funkce str_count()
, viz dále. Příklad je v dokumentaci funkce.
8.2.3 Řazení řetězců
Pro setřídění řetězců většinou stačí základní funkce sort()
a order()
. Pro složitější případy, kdy je např. třeba třídit v cizím locale, nabízí balík stringr dvě funkce:
str_order(s, decreasing = FALSE, na_last = TRUE, locale = "", ...)
vrací celé číslo, které odpovídá pořadí daného řetězce ve vektorus
(podobně jakoorder()
).str_sort(s, decreasing = FALSE, na_last = TRUE, locale = "", ...)
setřídí vektor řetězcůs
.
Přitom s
je vektor řetězců, který má být setříděn, decreasing
je logická hodnota (implicitní hodnota je FALSE
; pak třídí od nejnižšího k nejvyššímu; TRUE
třídí od nejvyššího k nejnižšímu), na_last
je logická hodnota (implicitní hodnota je TRUE
, při které funkce umístí hodnoty NA
na konec vektoru; FALSE
je umístí na začátek na začátek vektoru; NA
je vyhodí), locale
označuje v jakém locale se má třídit (implicitně v systémovém); ...
další parametry přidané do stri_opts_collator
.
str_order(letters, locale = "en")
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## [24] 24 25 26
str_sort(letters, locale = "en")
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
str_order(letters, locale = "haw")
## [1] 1 5 9 15 21 2 3 4 6 7 8 10 11 12 13 14 16 17 18 19 20 22 23
## [24] 24 25 26
str_sort(letters, locale = "haw")
## [1] "a" "e" "i" "o" "u" "b" "c" "d" "f" "g" "h" "j" "k" "l" "m" "n" "p"
## [18] "q" "r" "s" "t" "v" "w" "x" "y" "z"
8.2.4 Výběr a náhrada pomocí indexů
Někdy je třeba z řetězce vybrat jeho část. Pokud známe pozici prvního a posledního znaku, který chceme vybrat, můžeme použít funkce str_sub(s, start, end)
, kde s
je řetězec, ze kterého vybíráme, start
je pozice znaku začátku výběru a stop
je pozice konce výběru (včetně):
s1 <- "Sol 6: Katastrofa na Marsu."
str_sub(s1, start = 8, end = str_length(s1))
## [1] "Katastrofa na Marsu."
str_sub(s1, 8)
## [1] "Katastrofa na Marsu."
str_sub(s1, start = 8, end = -1)
## [1] "Katastrofa na Marsu."
str_sub(s1, end = 5)
## [1] "Sol 6"
Implicitní hodnota start
je 1 (tj. od začátku vektoru), implicitní hodnota end
je \(-1\) (tj. do konce vektoru). Pozice znaků mohou být zadány i jako záporná čísla – ta se počítají od konce vektoru, takže např. \(-1\) je poslední znak vektoru.
Funkce str_sub()
recykluje všechny své parametry. Pokud chceme např. vybrat stejné pozice z každého vektoru v řetězci:
s2 <- c(s1, "Sol 7: Nová naděje.")
str_sub(s2, start = c(8, 8))
## [1] "Katastrofa na Marsu." "Nová naděje."
str_sub(s2, 8) # totéž
## [1] "Katastrofa na Marsu." "Nová naděje."
Stejně tak je však možné recyklovat i řetězec a vybrat z něj naráz dva pod-řetězce:
str_sub(s1, start = c(8, 22), end = c(17, 26))
## [1] "Katastrofa" "Marsu"
Funkci str_sub()
je možné použít i k náhradě části řetězce:
str_sub(s1, 22, 26) <- "rudé planetě"
s1
## [1] "Sol 6: Katastrofa na rudé planetě."
8.2.5 Replikace řetězců
Někdy je potřeba nějaký řetězec “zmnožit”. K tomu slouží funkce str_dup(s, n)
, který vezme vektor s
, zopakuje jej n
-krát a výsledek spojí. To se hodí např. při načítání mnoha textových sloupců pomocí balíku readr. Při tom je užitečné říct funkci read_csv()
, že všechny sloupce tabulky mají typ character
. K tomu slouží řetězec mnoha “c”:
str_dup("c", 28)
## [1] "cccccccccccccccccccccccccccc"
Funkce str_dup()
také recykluje všechny své parametry:
str_dup(c("a", "b", "c"), 1:3)
## [1] "a" "bb" "ccc"
8.2.6 Odstranění okrajových mezer
Někdy dostaneme řetězec, který začíná nebo končí “bílými znaky” (mezerami, tabelátory, novými řádky \n
apod.). Tato situace vznikne např. tehdy, když řetězec vznikl rozdělením delšího řetězce na části. Tyto bílé znaky je často vhodné odstranit. K tomu slouží funkce str_trim(s, side)
, kde s
je řetězec a side
označuje stranu, ze které se mají bílé znaky odstranit:
s1 <- c("Ahoj,", " lidi, ", "jak ", "se", " máte?")
str_trim(s1, "left") # odstraní mezery zleva
## [1] "Ahoj," "lidi, " "jak " "se" "máte?"
str_trim(s1, "right") # odstraní mezery zprava
## [1] "Ahoj," " lidi," "jak" "se" " máte?"
str_trim(s1, "both") # odstraní mezery z obou stran
## [1] "Ahoj," "lidi," "jak" "se" "máte?"
str_trim(s1) # totéž -- "both" je implicitní hodnota side
## [1] "Ahoj," "lidi," "jak" "se" "máte?"
8.2.7 Zarovnání řetězců na stejnou délku
Někdy je užitečné zarovnat řetězce na stejnou délku přidáním bílých (nebo jiných) znaků. K tomu slouží funkce str_pad(s, w, side, pad)
, kde s
je vektor zarovnávaných řetězců, w
je minimální délka výsledného řetězce, side
je strana, na kterou se mají výplňové znaky přidat (implicitně je to left
) a pad
je výplňový řetězec (implicitně mezera).
str_pad(c("Ahoj", "lidi"), 7)
## [1] " Ahoj" " lidi"
str_pad(c("Ahoj", "lidi"), 9, side = "both", pad = "-")
## [1] "--Ahoj---" "--lidi---"
Delší řetězce funkce nemění:
str_pad(c("Ahoj", "malé zelené bytosti z Viltvoldu 7"), width = 7)
## [1] " Ahoj" "malé zelené bytosti z Viltvoldu 7"
8.2.8 Zarovnání do odstavce
Zarovnat řetězec do odstavce umožňuje funkce str_wrap(s, w, indent, exdent)
, kde s
je zarovnávaný řetězec, w
je cílová šířka sloupce (implicitně 80 znaků), indent
je odsazení prvního řádku a exdent
je odsazení následujících řádků (oboje implicitně 0 znaků):
s1 <- "Na počátku bylo Slovo, to Slovo bylo u Boha, to Slovo byl Bůh. To bylo na počátku u Boha. Všechno povstalo skrze ně a bez něho nepovstalo nic, co jest. V něm byl život a život byl světlo lidí. To světlo ve tmě svítí a tma je nepohltila."
cat(str_wrap(s1, 60))
## Na počátku bylo Slovo, to Slovo bylo u Boha, to Slovo byl
## Bůh. To bylo na počátku u Boha. Všechno povstalo skrze ně
## a bez něho nepovstalo nic, co jest. V něm byl život a život
## byl světlo lidí. To světlo ve tmě svítí a tma je nepohltila.
8.2.9 Konverze malých a velkých písmen
Ke konverzi velikosti písmen slouží funkce:
funkce | význam |
---|---|
str_to_upper(s, locale) |
konvertuje řetězec s na velká písmena |
str_to_lower(s, locale) |
konvertuje řetězec s na malá písmena |
str_to_title(s, locale) |
slova začínají velkým písmenem, zbytek jsou malá písmena |
Každá z nich převede řetězec s
. Pokud není nepovinný parametr locale
zadán, použije se aktuální locale počítače.
dog <- "The quick brown dog"
str_to_upper(dog)
## [1] "THE QUICK BROWN DOG"
str_to_lower(dog)
## [1] "the quick brown dog"
str_to_title(dog)
## [1] "The Quick Brown Dog"
# Locale matters!
str_to_upper("i", "en") # English
## [1] "I"
str_to_upper("i", "tr") # Turkish
## [1] "İ"
8.2.10 Konverze kódování
Funkce str_conv(string, encoding)
nastaví nebo změní aktuální kódování řetězce, viz dokumentace.