Podstawy R – Przechowywanie danych
Wychodząc naprzeciw potrzebom wskazanym przez naszych czytelników w ankiecie rozpoczynamy krótki kurs wprowadzający do R. Naszą przygodę zaczniemy od poznania sposobu przechowywania danych (kontenerów danych) w tym języku. Dla osób, które nie zdążyły zapoznać się jeszcze ze środowiskiem w którym będziemy pracować odsyłam do wpisów poświęconych instalacji i pierwszym krokom w R.
Pierwszym sposobem przechowywania danych jest wektor. W wektorze możemy przechowywać dane tylko jednego typu np. numeryczne. Stwórzmy przykładowy wektor w zawierający cztery liczby:
w = c(1,4,5,3)
Wyświetlamy utworzony wektor w w konsoli:
w
[1] 1 4 5 3
W przypadku gdy chcemy wyświetlić konkretny element wektora musimy wpisać:
w[3]
[1] 5
Możemy również wyświetlić więcej elementów:
w[3:4]
[1] 5 3
Teraz stwórzmy wektor zawierający kolejne liczby od 1 do 5:
w = c(1:5)
w
[1] 1 2 3 4 5
Wektor może zawierać też ciągi znaków np. z pięcioma imionami:
w = c(‘John’,’Sophia’,’Al’,’Jack’,’Donald’)
w
[1] "John" "Sophia" "Al" "Jack" "Donald"
A co gdy chcemy przechowywać różnego typu zmienne w jednym obiekcie? Możemy skorzystać z obiektu list, który umożliwia przechowywanie różnego typu danych w swoich elementach. Stwórzmy listę zawierającą dowolne trzy wartości o różnym typie:
l = list(23.2,'John',TRUE)
Wyświetlamy w konsoli utworzoną zmienną:
l
[[1]]
[1] 23.2
[[2]]
[1] "John"
[[3]]
[1] TRUE
W celu wyświetlenia drugiego elementu listy musimy wpisać:
l[[2]]
[1] "John"
W przypadku dwuwymiarowych danych, np. rastrów wartości poszczególnych pikseli przechowane są w macierzy. Dowolną macierz tworzymy funkcją matrix podając wartość jaką ma ją wypełniać oraz liczbę wierszy i kolumn:
m = matrix(2, nrow = 3, ncol = 3)
m
[,1] [,2] [,3]
[1,] 2 2 2
[2,] 2 2 2
[3,] 2 2 2
Możemy również wstawić do macierzy dowolny wektor, który ma liczbę elementów równą liczbie wierszy lub wszystkich pól macierzy:
m = matrix(c("Bob","John","Jack"),nrow = 3, ncol = 3)
m
[,1] [,2] [,3]
[1,] "Bob" "Bob" "Bob"
[2,] "John" "John" "John"
[3,] "Jack" "Jack" "Jack"
Wybór dowolnego elementu w macierzy dokonuje się poprzez podanie numeru wiersza i kolumny:
m[1,2]
[1] "Bob"
Wybrać można również cały wiersz lub kolumnę:
m[1,]
[1] "Bob" "Bob" "Bob"
m[,1]
[1] "Bob" "John" "Jack"
Macierz tak jak wektor może przechowywać dane tylko jednego typu.
W R można również używać wielowymiarowych macierzy zwanych array. Tworzone są poprzez podanie wartości w niej przechowywanych oraz wymiaru:
a = array(1:24, dim=c(3,4,2))
a
, , 1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
, , 2
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24
Innym rodzajem przechowywania danych jest factor. Pokażemy jak on działa na przykładzie. Utwórzmy sobie wektor zawierający nazwy miast:
towns = c("Cracow","Warsaw","Gdansk","Warsaw","Cracow","Poznan","Bialystok","Szczecin")
Zmieńmy ten wektor na factor i wyświetlmy go:
towns = factor(towns)
towns
[1] Cracow Warsaw Gdansk Warsaw Cracow Poznan Bialystok Szczecin
Levels: Bialystok Cracow Gdansk Poznan Szczecin Warsaw
Jak widzimy pojawił nam się wektor oraz poziomy będące nazwami miast, żeby pokazać jak to działa zróbmy przekształcenie factora na wektor numeryczny:
as.numeric(towns)
[1] 2 6 3 6 2 4 1 5
Jak widzimy factor jest ciągiem liczb, do których przypisane są wartości z Levels. Jak dana wartość się powtarza w ciągu występuje ta sama liczba. A tak naprawdę w czym nam może się to przydać, poza zmniejszoną liczbą miejsca potrzebną na przechowywanie tego typu danych. Na przykład przy zliczaniu występowania danego elementu:
table(towns)
towns
Bialystok Cracow Gdansk Poznan Szczecin Warsaw
1 2 1 1 1 2
Ostatnim rozpatrywanym przez nas zmienną, w której możemy przechowywać dane jest data frame. W najprostszy sposób można ją opisać jako arkusz Excel przechowujący dane w kolumnach i wierszach. W każdej z kolumn możemy przechowywać inny rodzaj danych. Utwórzmy prosty data frame:
df = data.frame(N = c(1:3),name = c("John","Natalie","Kate"),surname = c("Black","White","Gray"),age = c(15,6,13), adult = c(F,F,F))
df
N name surname age adult
1 1 John Black 15 FALSE
2 2 Natalie White 6 FALSE
3 3 Kate Gray 13 FALSE
Mieliśmy już do czynienia z tym typem danych przy analizie plików wektorowych, bo to właśnie tabela atrybutów warstwy SHP jest wczytywana w takiej postaci. Z data frame możemy wyciągać tak jak dla macierzy kolumny:
df[,2]
[1] John Natalie Kate
Levels: John Kate Natalie
lub wiersze:
df[1,]
N name surname age adult
1 1 John Black 15 FALSE
Każdy wiersz i kolumna ma też swoją nazwę, które możemy wykorzystać do selekcji:
df$name
[1] John Natalie Kate
Levels: John Kate Natalie
df[,'name']
[1] John Natalie Kate
Levels: John Kate Natalie
Możemy też je wyświetlić:
colnames(df)
[1] "N" "name" "surname" "age" "adult"
rownames(df)
[1] "1" "2" "3"
Wybór metody przechowywania danych jest uzależniony, od sposobu w jakim są one zapisane w plikach. Tak jak wspomnieliśmy dla rastrów będzie to np. macierz, a dla wczytywanych arkuszy kalkulacyjnych data frame. W kolejnym etapie kursu pokażemy jak posługiwać się pętlami na danych.