Skip to content
Mateusz Żółtak edited this page Mar 16, 2015 · 1 revision

Wstęp

Poniżej zapoznamy się z następującymi zagadnieniami:

  • co to jest pakiet R i jak go załadować;
  • co to są obiekty R oraz w jaki sposób możemy je zapamiętywać pod wskazanymi nazwami;
  • jak nawiązać połączenie z bazą danych IBE;
  • jak zapisywać i wczytywać w R zbiory danych w formatach .RData i .CSV.

Pakiety R

  • R można łatwo rozszerzać o dodatkowe funkcje (na podobnej zasadzie, jak np. wtyczki dla przeglądarki internetowej). Rozszerzenia takie noszą nazwę pakietów.
  • W szczególności dostęp do bazy danych IBE realizowany jest poprzez dedykowany do tego celu pakiet ZPD.
  • Poza pakietem ZPD w pracy z R będziemy korzystać także z kilku innych pakietów, np. do rysowania wykresów, itp.

Aby móc skorzystać z pakietu, trzeba:

  • [jednorazowo] zainstalować pakiet - to zrobiliśmy już przygotowując się do warsztatów;
  • załadować pakiet komendą library(nazwa_pakietu)
    • stąd też każdy przykład na warsztatach zaczyna się linijką library(ZPD)
  • raz załadowany pakiet jest dostępny aż do wyłączenia programu RStudio.

Załadujmy teraz pakiet ZPD:

library('ZPD')

Obiekty R

  • R umożliwia wczytanie i jednoczesną pracę z wieloma zbiorami danych.
  • Aby móc rozróżnić pomiędzy wieloma wczytanymi zbiorami danych, każdy z nich podczas wczytywania zapamiętywany jest pod wskazaną przez nas nazwą.
  • Poza zbiorami danych R umie zapamiętywać także inne "byty", np. pojedyncze zmienne (wektory wartości) w oderwaniu od zbioru danych, czy obiekty połączenia z bazą danych.
    • Zapamiętywane są one tak samo, jak wczytywane zbiory danych - pod wskazanymi przez nas nazwami.

Wszystkie zapamiętane przez nas "byty" (czy to zbiory danych, czy pojedyncze zmienne, czy inne) będziemy nazywać obiektami.

  • Listę wszystkich zapamiętanych obiektów można zobaczyć w panelu Environment w prawym górnym rogu ekranu programu RStudio.
    • Jest ona podzielona na grupy, np. w grupie Data znajdują się zbiory danych, a w grupie Values pojedyncze zmienne, niebędące częścią żadnego zbioru danych.
  • Aby zapamiętać obiekt (czy to zbiory danych, czy pojedyncze zmienne, czy jakiś inny) pod wskazaną nazwą, używamy składni:
nazwa_pod_jaka_ma_byc_zapamietany = co_ma_zostac_zapamietane

# np. wczytujemy zbiór danych z pliku CSV i zapamiętujemy go jako obiekt o nazwie "mojZbior"
mojZbior = read.csv2('nazwa_pliku.csv', stringsAsFactors = F)

Zapamiętywanie przekształceń danych

Kolejną charakterystyczną cechą R jest to, że dokonane przez nas przekształcenia danych nie są automatycznie zapisywane.

Jeśli np. wczytamy zbiór danych, a następnie utworzymy w nim nową zmienną, to wynik zostanie co prawda wyświetlony na ekranie, ale nie zostanie automatycznie zapisany w obiekcie zbioru danych, na którym dokonywaliśmy przekształcenia:

# tworzymy prosty zbiór danych z dwoma zmiennymi i trzema obserwacjami:
dane = data.frame('zmienna1' = c(1, 2, 3), 'zmienna2' = c(1, 2, 3))
# podglądamy zawartość zbioru danych:
dane 
##   zmienna1 zmienna2
## 1        1        1
## 2        2        2
## 3        3        3
# tworzymy dodatkową zmienną, jako sumę dwóch już istniejących - wyświetli się zbiór danych z dodaną zmienną:
mutate(dane, 'zmienna3' = zmienna1 + zmienna2) 
##   zmienna1 zmienna2 zmienna3
## 1        1        1        2
## 2        2        2        4
## 3        3        3        6
# podglądamy zawartość zbioru, który modyfikowaliśmy - pozostał niezmieniony:
dane 
##   zmienna1 zmienna2
## 1        1        1
## 2        2        2
## 3        3        3

Aby zapamiętać dokonane przekształcenie, musimy explicite kazać R zapamiętać jego wynik jako nowy obiekt:
(jeśli nadamy mu taką samą nazwę, jak obiekt już istniejący, to zostanie on nadpisany)

# tworzymy prosty zbiór danych z dwoma zmiennymi i trzema obserwacjami:
dane = data.frame('zmienna1' = c(1, 2, 3), 'zmienna2' = c(1, 2, 3))
# podglądamy zawartość zbioru danych:
dane 
##   zmienna1 zmienna2
## 1        1        1
## 2        2        2
## 3        3        3
# tworzymy dodatkową zmienną, jako sumę dwóch już istniejących i ZAPAMIĘTUJEMY wynik
dane = mutate(dane, 'zmienna3' = zmienna1 + zmienna2) 
# podglądamy zapamiętany wynik - pojawiła się nowa zmienna
dane 
##   zmienna1 zmienna2 zmienna3
## 1        1        1        2
## 2        2        2        4
## 3        3        3        6

Definiowanie wartości

Podczas pracy z R często będziemy potrzebować podać konkretną wartość lub zakres wartości, wedle których ma nastąpić przekształcenie danych, np.:

  • wskazać zakres lat, za które chcemy pobrać wyniki (zakres wartości liczbowych)
  • wskazać, czy wyniki pobrane z bazy mają być wypunktowane (wartość logiczna)
  • wskazać rodzaj egzaminu (wartość tekstowa)
  • itd.

W R definiujemy je w następujący sposób:

  • wartości liczbowe:
    • pojedyncza liczba - po prostu wpisujemy liczbę, np. 1
    • zakres kolejnych liczb - składnia od:do, np. 1:10
    • wiele niekolejnych liczb - składnia c(liczba1, liczba2, ...), np. c(1, 5, 11)
    • kombinacja liczb niekolejnych, zakresów kolejnych liczb, itp:, np. c(1:10, 15, 17, 20:22)
  • wartości logiczne:
    • prawda - TRUE lub skrótowo T
    • fałsz - FALSE lub skrótowo F
    • ciągi wartości - składnia c(wartość1, wartość2, ...), np. c(TRUE, TRUE, FALSE)
  • wartości tekstowe:
    • pojedyncza wartość - w apostrofach lub cudzysłowach, np. 'a' lub "a"
    • wiele wartości - składnia c(wartość1, wartość2, ...), np. c("a", "b", "c")

Każdy taki ciąg wartości możemy zapamiętać pod wskazaną nazwą, jak każdy inny obiekt R:

mojCiagWartosci = c("a", "b", "c")
mojCiagWartosci # podejrzyjmy, co zostało zapamiętane
## [1] "a" "b" "c"

Łączenie się z bazą danych IBE

Baza danych IBE znajduje się na serwerze IBE, a więc aby móc z niej skorzystać, trzeba:

  • najpierw nawiązać połączenie z serwerem IBE
    • służy do tego funkcja polacz() pakietu ZPD
  • następnie przy pobieraniu danych używać tego połączenia
    • przekazując je zawsze jako pierwszy argument funkcji pobierającej dane

Stąd też:

  • każdy przykład na warsztatach rozpoczyna się kodem
library(ZPD)   # ładujemy pakiet ZPD
src = polacz() # zapamiętujemy nawiązane połączenie w obiekcie o nazwie "src"
  • za każdym razem, kiedy korzystamy z funkcji pobierającej dane z bazy, przekazujemy zapamiętane połączenie jako pierwszy argument
pobierz_testy(src)

O zamykanie połączeń z serwerem nie trzeba się martwić, następuje ono automatycznie.

Wczytywanie i zapisywanie zbiorów danych

  • R posiada swój własny format zapisu danych (.RData)
    • jego zalety to szybkość wczytywania i zapisu danych oraz mały rozmiar plików
    • jego wada to brak obsługi przez jakikolwiek inny program
    • będziemy go stosować (z uwagi na oszczędność czasu):
      • podczas wczytywania przykładowych danych na tych warsztatach
      • do chwilowego przechowywania danych (np. wtedy, gdy wykonujemy czasochłonne operacje, które mogą zakończyć się błędem i zabezpieczamy się zapisując wyniki pośrednich operacji)
  • R umie wczytywać pliki danych w formatach .CSV, .SAV (SPSS), .DTA (Stata) oraz innych programów statystycznych
  • Zapis danych:
    • do formatu CSV przebiega łatwo i bezproblemowo
    • do formatów innych programów statystycznych generalnie jest możliwy, ale wymagałby dokładniejszego omówienia.

W związku z tym poniżej omówione zostaną wczytywanie i zapis danych jedynie do plików w formacie .RData oraz .CSV.

Do plików R

Zaletą formatu danych R jest to, że dane zapisują się i wczytują bardzo szybko, jak również niewielki rozmiar plików na dysku (są kompresowane). Jeśli będzie się przez chwilę pracować z danymi w R (np. złączając je ze sobą i przekształcając), warto korzystać właśnie z tego formatu, a dopiero ostatecznie przygotowane dane zapisać w jakimś przenośnym formacie (np. .CSV).

Do zapisu i odczytu służą funkcje:

  • zapis: save(nazwaObiektu1, ..., file = 'ścieżka do pliku.RData') - zapisuje wskazane obiekty (dowolną liczbę) do pliku;
  • odczyt: load('ścieżka do pliku.RData') - wczytuje zmienne z pliku; zostaną wczytane z takimi nazwami, z jakimi zostały zapisane.
# zapis
mojeDane = data.frame('zmienna1' = c(1:3), 'zmienna2' = c('a', 'b', 'c'))
ciagWartosci = c('a', 'b', 'c')
save(mojeDane, ciagWartosci, file = '~/przyklad.RData')

# odczyt
rm(mojeDane, ciagWartosci) # usuńmy zmienne, aby zobaczyć, że faktycznie się wczytają
load('~/przyklad.RData')

Do plików CSV

CSV jest najbardziej przenośnym formatem - daje się odczytać i zapisać w praktycznie każdym programie statystycznym.

Do zapisu i odczytu plików CSV "w formacie Excela" służą w R funkcje:

  • zapis: write.csv2(zbiorDanych, 'ścieżka do pliku.csv', row.names = F, na = '', fileEncoding = 'Windows-1250');
  • odczyt: read.csv2('ścieżka do pliku.csv', stringsAsFactors = FALSE) (przy czym tym razem wynik działania funkcji należy przypisać do zmiennej).
# zapis
mojeDane = data.frame('zmienna1' = c(1:3), 'zmienna2' = c('a', 'b', 'c'))
write.csv2(mojeDane, '~/przyklad.RData', row.names = F, na = '', fileEncoding = 'Windows-1250')

# odczyt
mojeDane2 = read.csv2('~/przyklad.RData', stringsAsFactors = FALSE)
mojeDane2
##   zmienna1 zmienna2
## 1        1        a
## 2        2        b
## 3        3        c

Istnieją też alternatywne funkcje, zapisujące/odczytujące z użyciem innych ustawień (np. innego separatora kolumn, innego separatora dzisiętnego, itp.).