-
Notifications
You must be signed in to change notification settings - Fork 0
Podstawy R
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.
- 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)
- stąd też każdy przykład na warsztatach zaczyna się linijką
- raz załadowany pakiet jest dostępny aż do wyłączenia programu RStudio.
Załadujmy teraz pakiet ZPD:
library('ZPD')
- 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)
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
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)
- pojedyncza liczba - po prostu wpisujemy liczbę, np.
- wartości logiczne:
- prawda -
TRUE
lub skrótowoT
- fałsz -
FALSE
lub skrótowoF
- ciągi wartości - składnia
c(wartość1, wartość2, ...)
, np.c(TRUE, TRUE, FALSE)
- prawda -
- 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")
- pojedyncza wartość - w apostrofach lub cudzysłowach, np.
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"
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
- służy do tego funkcja
- 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.
- 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.
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')
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.).