Ze zmiennymi tekstowymi spotykamy się przede wszystkim w nazwach zmiennych w danych. Oprócz tego możemy spotkać się ze zmiennymi tekstowymi, w takim przypadku przeważnie do analizy należy przekształcic te dane. Najczęściej spotykaną formą zmiennej, która wczytuje się w postaci zmiennej tekstowej jest czas (data, godzina).

Podstawowe funkcje na zmiennych tekstowych

Najczęściej używanymi funkcjami na zmiennych losowych są:

paste()

Podstawowa funkcja uzywana szczególnie do tworzenia tytułów, podpisów, nazw plików. Jeżeli chcemu uzależnić nazwę od wartości jakiejś zmiennej.

Stwórzmy histogram losowej zmiennej z danych mtcars i podpiszmy go w zależności od tego jaka jest wylosowana zmienna

data(mtcars)
set.seed(11)
#losujemy numer zmiennej
index<-sample(1:11, 1)
#wylosowana zmienna
x<-mtcars[[index]]

#tworzymy tytuł
title<-paste("histogram", names(mtcars)[index])
#tworzymy opis osi x
x.label<-paste("wartość", names(mtcars)[index])

#tworzymy wykres
hist(x, xlab=x.label, main=title, col=4)

strsplit()

Przeanalizujmy działanie funkcji strsplit na przykładzie zmiany zmiennej czas na trzy zmienne liczbowe: godzina, minuta sekunda.

Weźmy 1000 pierwszych elementów z danych tickowych z GPW.

#adres url danych
data.url<-"https://raw.githubusercontent.com/amachno/MSAD/master/dane/market1.txt"
#wczytujemy 1000 pierwszych wierszy do R
dane<-read.table(data.url, nrows=1000)

Zobaczmy jak te dane wyglądają:

str(dane)
## 'data.frame':    1000 obs. of  4 variables:
##  $ czas : Factor w/ 439 levels "09:00:01","09:00:02",..: 1 1 1 1 1 1 1 2 2 2 ...
##  $ nazwa: Factor w/ 20 levels "FKGHH7","FPKNH7",..: 5 8 8 8 8 8 9 7 7 7 ...
##  $ cena : num  12860 34600 34600 34600 34600 ...
##  $ ilosc: int  1 1 1 1 1 1 1 5 5 5 ...

Zmienna czas wczytała się jako zmienna kategoryczna. Zmieńmy ją na zmienną tekstową:

dane$czas<-as.character(dane$czas)

Zamienimy zatem pierwszą godzine na trzy liczby:

#Dzielimy tekst w miejscach gdzie znajduje sie dwukropek
czas.1.list<-strsplit(dane$czas[1], split = ":")
czas.1.list
## [[1]]
## [1] "09" "00" "01"

Zauważmy, że w wyniku otrzymujemy listę, w której pierwszym (jedynym) elementem jest interesujący nasz wektor. Możemy wywołać funkcję na wszystkich elementach wektora dane$czas.

#Dzielimy tekst w miejscach gdzie znajduje sie dwukropek
czas.list<-strsplit(dane$czas, split = ":")
head(czas.list)
## [[1]]
## [1] "09" "00" "01"
## 
## [[2]]
## [1] "09" "00" "01"
## 
## [[3]]
## [1] "09" "00" "01"
## 
## [[4]]
## [1] "09" "00" "01"
## 
## [[5]]
## [1] "09" "00" "01"
## 
## [[6]]
## [1] "09" "00" "01"

Tworzona zostaje lista 1000-elementowa, w której każdym elementem jest wektor składający sie z tekstów po podziale. W tym przykładzie każdy element listy jest równo liczny, jednak gdyby tak nie było przechowywanie wyniku w postaci listy byłoby najwygodniejsze.

Funkcja strsplit() bardzo często jest używana wraz z lapply() lub sapply().

sub() i gsub()

Róznica między sub() i gsub() polega na tym, że sub() zamienia tylko pierwsze wystąpienie znaku w zmiennej (jeśli występuje), a gsub() zamienia wszystkie wskazane znaki w zmiennej.

Najczęściej używamy tych funkcji do czyszczenia danych. Otrzymane dane często mają w sobie kropki, przecinki, podkreślenie, spacje itp. Przykład:

#wprowadzamy ręcznie wektor dwuelementowy, z którego chcemy usunąć podkreślenie "_"
my.vect<-c("my_variable", "my_new_variable")

#działanie sub()
sub("_", "", my.vect)
## [1] "myvariable"     "mynew_variable"
gsub("_", "", my.vect)
## [1] "myvariable"    "mynewvariable"

grep()

Funkcja grep() jest przeważnie używana wraz z użyciem wyrażeń systematycznych. W przypadku, gdu chcemy znaleźć zmienne, w których występuje wyrażenie “cat”:

#tworzymy wektor z trzeba tekstami
x<-c("I have a cat", "I have a dog", "I have a dog and a cat")

#znajduję elementy wektora, w których jest słowo "cat"

grep("cat", x)
## [1] 1 3

Ważne elementy korzystania ze zmiennych tekstowych

Dodatkowe tematy

Jest wiele zagadnień, z którymi możemy się napotkać związanych ze zmiennymi tekstowymi. Niektóre z nich, w wielkim skrócie, opisuję w tym rozdziale.

Daty i godziny

Do podstawowych zastosowań wystarczającymi metodami pracy z danymi czasowymi jest traktowanie ich jako dane tekstowe. Jednak, gdy pracujemy na danych czasowych w sposób złożony, lepiej jest użyć zmiennych typu czasowego. Dla dat jest to clasa Date, a dla danyczasowych z dokładnością większą niż dzień (np. godzina:minuta:sekunda) są to klasy POSIXlt i POSIXct

Wyrażenia systematyczne

Często zdaża się, że chcemy znaleść (lub zamienić) wyrażenia w tekście, które nie są dokładnym ciągiem znaków. Np. chcemy znaleźć zmienne, w których występuje wyrażenie “cat” lub wyrażenie “dog”, albo chcemy znaleźć wyrażenia “cat”, bez względu na wielkość liter, albo chcemy zamienić wszystkie znaki specjalne za jednym razem, a nie każdy z osobna.

W takim przypadku stosujemy wyrażenia systematyczne. Np. chcąc usunąc kropki i przecinki ze zmiennych:

#wprowadzam zmienną tekstową z kropkami i przecinkami
x<-c("2000.12.01", "2001,02,01", "2003-01-12")

#zamieniam kropki i przecinki na "-"

gsub("\\.|,", "-", x)
## [1] "2000-12-01" "2001-02-01" "2003-01-12"