Projekt R

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.