1 O pakiecie R
R jest obiektowym, interpretowanym, interaktywnym językiem
programowania. Jest obecnie podstawowym językiem wykorzystywanym w
statystycznej analizie danych. Jest całkowicie darmowy (oparty o
licencję GNU).
Pierwsza wersja R została stworzona na początku lat 90-tych przez
Roberta Gentlemana i Rossa Ihakę (Wydział Statystyki, Uniwersytet w
Auckland, Nowa Zelandia). Od 1997 roku rozwojem projektu kierował zespół
ponad 20 ekspertów z różnych dziedzin tj. statystyka, analiza numeryczna
czy informatyka. Od tamtego czasu grupa ta znacząco się powiększyła.
Ponadto swoje funkcje piszą naukowcy z całego świata.
Na stronie projektu można znaleźć nie tylko najnowszą wersję R, ale również bogatą dokumentację oraz wiele darmowych podręczników: http://www.r-project.org.
1.1 R i RStudio są darmowe - skąd ściągnąć?
R i RStudio są darmowe (miło), można bez przeszkód korzystać z nich w domu. W przypadku zastosowań komercyjnych sugeruję dokładne zapoznanie się z licencją.
Najłatwiej, choć nie jedyny sposób, to użycie strony:
https://posit.co/download/rstudio-desktop/
Pojawi się okno
Najpierw instalujemy R - to co oznaczone “1” na powyższym obrazku. Link przeniesie nas na stronę, gdzie dostępne są wersje R dla Windows, Linux i MacOs. Wybieramy odpowiednią wersję.
Potem instalujemy RStudio, np używając przycisku “2” jak na powyższym rysunku. W dolnej części strony są dostępne wersje RStudio dla innych systemów operacyjnych.
1.1.1 Aktualizacje i reinstalacje
Niestety, czasami zdarzają się różne “dziwne” problemy między innymi ze zgodnością wersji. Czasami najprostszym rozwiązaniem jest aktualizacja (czasami RStudio informuje o nowej wersji przy starcie) lub całkowite odinstalowanie i ponowna instalacja R i RStudio. Wiem, że marna wskazówka, ale paru osobom i kilka razy w pracowni zadziałało.
2 RStudio
RStudio jest zintegrowanym środowiskiem programistycznym dla języka R. Posiada prosty interfejs użytkownika zbudowany wokół paska menu i kilku okien, którego głównym celem jest zapewnienie skrótów do niektórych z najczęściej używanych poleceń. Oczywiście te same funkcje można wywołać, wpisując odpowiednie polecenia w oknie konsoli. RStudio jest bardzo przydatnym narzędziem ułatwiającym debugowanie, tworzenie pakietów, aplikacji i raportów.
Okno edycji skryptów umożliwia tworzenie i zapisywanie skryptów.
W oknie Konsoli wyświetlane są wyniki, można tam też wpisywać instrukcje/polecenia.
W prawym dolnym oknie wyświetlane są rysunki (o tym na innych zajęciach) i pomoc.
Prawe górne okno Enviroment - środowisko zawiera m.in. informacje na temat utworzonych zmiennych.
2.1 Konsola
Pojedyncze polecenia (lub ich grupy) można wpisywać w konsoli,
zatwierdzając je Enterem.
W konsoli pojawiają się też wyniki działania poleceń.
W konsoli, za pomocą strzałek góra i dół na
klawiaturze, można wybrać z historii wcześniej wpisywane instrukcje.
W przypadku większej ilości instrukcji wygodniejsze jest utworzenie skryptu - ciągu poleceń.
2.2 Tworzenie nowego skryptu i zapisanie go
W menu File wybieramy New file a następnie R Script. Plik ten zapisujemy sobie pod wybraną nazwą w wybranym miejscu (tak żeby nie utracić zapisanej pracy).
2.3 Praca ze skryptami
Pojedyncze komendy lub ich grupy wykonuje się poprzez ich zaznaczenie
i naciśnięcie Ctrl+Enter lub naciśnięciu przycisku
Run (znajdującego się w górnej prawej części okna Edycji
skryptów).
2.4 Pliki i raporty R Markdown
Do prezentacji wyników, kodów i innych elementów wykonywanych w R wygodne są pliki R Markdown. Umożliwiają one połączenie kodów R, tekstu, grafiki oraz symboli matematycznych.
Z Menu File wybieramy New file a następnie R Markdown….
Pojawi się okienko
gdzie możemy uzupełnić tytuł, autora i datę (można je zmienić później) i klikamy OK. Plik zapisujemy pod wybraną nazwą w OBOWIĄZKOWO wybranym folderze (pojawią się tam dodatkowe pliki, więc lepiej żeby nie był to pulpit, a wybrany, specjalnie utworzony folder).
Kliknięcie przycisku Knit w górnej części okna spowoduje
wygenerowanie raportu Markdown oraz utworzenie w folderze pliku html z
raportem.
2.4.1 Zadanie
Przejrzeć strukturę pliku źródłowego R Markdown. Zwrócić uwagę na:
Preambuła, gdzie można zmienić autora, nazwę oraz datę:
tej części kodu - nie ruszamy
Możliwość przełączenia między trybami
sourceorazvisual- wypróbować działanieWpisywanie zwykłego tekstu, nagłówków itp
Wpisywanie kodu R - jak zaczniemy pracę, stanie się jasne, co jest kodem R - otoczonego odpowiednimi znacznikami:
Dodanie kodu R (znaczników) jest możliwe także za pomocą przycisku w prawej górnej części okna skryptów (zielone C)
2.5 Wybrane ustawienia RStudio
2.5.1 Sprawdzanie pisowni
Warto włączyć sprawdzanie pisowni, czy to w języku polskim czy angielskim. W tym celu wybieramy w menu Tools pozycje Global Options… a następnie:
2.5.2 Wygląd edytora
Wybieramy w menu Tools pozycje Global Options… a następnie:
2.6 Instalowanie i ładowanie dodatkowych pakietów
2.6.1 Polecenie w R do instalowania i ładowania bibliotek
Istotną zaletą R jest duża liczba wyspecjalizowanych bibliotek (pakietów).
Do instalowania bibliotek służy polecenie
install.packages(), gdzie w nawiasie podajemy nazwę
instalowanej biblioteki. Daną bibliotekę instalujemy tylko
raz na danym urządzeniu. Przykład:
Po zainstalowaniu, gdy chcemy skorzystać z biblioteki, musimy
za każdym razem dołączyć wybraną bibliotekę poleceniem
library():
2.6.2 Alternatywny sposób instalowania pakietu
Być może wygodniejszy sposób to wybranie z menu Tools
polecenia Install Packages... i poprzez okno wyszukiwarki
znaleźć odpowiedni pakiet:
Gdy otworzymy skrypt lub plik Markdown, który zawiera niezainstalowany pakiet, pojawia się też monit z informacją o braku pakietu i sugestią jego zainstalowania:
3 Wprowadzenie do R
3.1 Inicjalizacja zmiennych w R
Zmienne w R inicjalizuje się przez przypisanie do nich wartości za
pomocą operatora przypisania <- lub =.
Operator <- jest tradycyjnie preferowany w R, natomiast
ich działanie jest takie samo. Na przykład, liczba <-10,
miasto = "Krakow". Aby szybko wpisać <-
wciśnij alt+-.
3.1.1 Zadanie
Wpisać w konsoli kolejno polecenia liczba <-10,
miasto = "Krakow" każde z nich zatwierdzając
Enterem.
3.2 Wyświetlanie wyników
Gdy chcemy wiedzieć, co zawiera dany obiekt/zmienna, można wpisać
jego nazwę w konsoli lub w skrypcie. Następnie wyświetlana jest
zawartość obiektu w konsoli. W RStudio można również zajrzeć do okna
“środowisko” Enviroment (domyślnie w prawym górnym rogu),
które zawiera wszystkie zmienne występujące w środowisku pracy. W tej
chwili nasze środowisko pracy zawierać powinno 2 obiekty o nazwach
liczba oraz miasto.
Aby uniknąć błędów programistycznych podczas pracy z R, należy regularnie sprawdzać, co znajduje się w tworzonych obiektach. Wykonując kolejne ćwiczenia należy wykonując kolejne linie poleceń sprawdzać, czy zostały utworzone nowe obiekty lub czy istniejące obiekty zostały zmodyfikowane (tak jest, gdy pojawia się znak = lub <-), a gdy tak jest, to co te obiekty zawierają.
3.3 Pomoc
Aby uzyskać pomoc na temat konkretnej funkcji lub pakietu, można użyć
funkcji help() lub znaku zapytania ?, np.
help(sum) ?sum
3.4 Zarządzanie środowiskiem pracy
Możliwe jest usuwanie utworzonych obiektów za pomocą funkcji
rm() lub z menu okna ‘środowisko/Enviroment’ (wyszukując
obiekt, a następnie używając przycisku z miotłą). Wykonaj polecenie
rm(liczba) i sprawdź, czy zmienna liczba
zniknęła ze środowiska pracy. Spróbuj usunąć inną zmienną ustawiając w
oknie ‘środowisko’ Grid (kliknij strzałkę przy List i zmień na Grid), a
następnie zaznacz zmienną do usunięcia i wykorzystaj przycisk miotły.
Naciśnięcie przycisku miotły przy opcji List spowoduje usunięcie
wszystkich zmiennych. Natomiast kombinacja Ctrl+L czyści
konsolę.
Za pomocą polecenia rm(list = ls()) można wyczyścić całe
środowisko pracy. Polecenie to można umieścić na początku skryptu R, aby
mieć pewność, że pracujemy w “czystym” środowisku.
3.5 Komentarze
Aby dodać komentarz w kodzie/skrypcie R używamy znaku #.
Komentarzem jest wtedy cała linijka występująca po tym znaku.
Aby zakomentować blok kodu (kilka linijek) w skrypcie, zaznaczamy
wybrane linie kodu, a następnie korzystamy z kombinacji
Ctrl+Shift+c. Ponowne użycie tej kombinacji usuwa
komentarze z zaznaczonych linijek.
4 Struktury danych
Najczęściej dane w R przyjmują formę wektorów (dzisiaj), list i ramek (kolejne zajęcia).
Wektory są podstawową struktura danych. Każda liczba traktowana jest
jako wektor jednoelementowy. Wektory budowane są przy użyciu funkcji
c().
4.1 Wektory
Wykonaj i przeanalizuj poniższe komendy wpisując je
w górne lewe okno RStudio. Uwaga: część tekstu
występująca po znaku # to komentarz. Pojedyncze komendy lub ich grupy
wykonuje się poprzez ich zaznaczenie i naciśnięcie
Ctrl+Enter lub naciśnięciu przycisku Run
(znajdującego się w górnej prawej części okna poleceń).
4.2 Operacje na wektorach
a1 = c(5,6,1) |
#Tworzenie wektora |
a2 <- c(4.3,-5) |
|
a=c(a1,a2) |
# Łączenie wektorów |
tekst=c("auto","traktor") |
#Utworzenie wektora, którego elementami są ciągi znaków |
a1[1] |
# [ ] jest używany do dostępu do współrzędnych wektora |
a1[0] |
# Indeksem pierwszego elementu jest 1 (w Pythonie jest to 0) |
a1[1]=0 |
# Przypisuje pierwszej współrzędnej wektora a1 wartość 0 |
a1[c(2,4)] |
#Wypisanie 2 i 4 współrzędnej wektora a1 |
d=a1[c(1,3)] |
#Wektor d utworzony został z 1 i 3 współrzędnej wektora a1 |
x=3:14 |
#x jest wektorem 12-sto elementowym o współrzędnych 3,4,…,14 |
x[1:5]=1 |
#Przypisanie pierwszym pięciu współrzędnym wektora x wartości 1 |
2*a1 |
#Mnożenie każdej współrzędnej wektora a1 przez 2 |
e=3/d |
#Zauważ, że 1/0 = Inf |
f=a1-4 |
#Odejmowanie 4 od każdej współrzędnej wektora a |
d1=d+e |
|
d1=d1-e |
#Zauważ, że Inf-Inf=NaN (“Not a Number”) |
d*e |
#Mnożenie wektorów współrzędna po współrzędnej |
e/d |
#Dzielenie wektorów współrzędna po współrzędnej |
sum(d) |
#Oblicz sumę współrzędnych wektora d |
length(d) |
#Długość wektora d |
t(d) |
#Transpozycja wektora d |
t(d)%*%e |
# %*% jest operatorem mnożenia macierzowego |
4.3 Funkcje matematyczne.
R jest wyposażony w bogaty zestaw funkcji matematycznych, które można
wykorzystywać do zaawansowanych obliczeń i analiz danych. Przykładowo,
można obliczyć
g <- c(sqrt(2), log(10)) * (1 + exp(2)) / cos(8).
4.3.1 Zadanie
Zainicjuj dwa wektory: a=[4,0.5, 7, 0.5] oraz b=[2,0.1,3, 5.2]
- Policz średnią dla wektora a.
- Policz iloczyn skalarny a \(\circ\) b.
- Policz średnią ważoną, elementów wektora a, gdzie wagi są określone w wektorze b.
- Oblicz odległość euklidesową pomiędzy wektorami a i b.
–>
4.4 Testy logiczne
1==1 |
|
1>2 |
|
1!= 2 |
#Symbol != oznacza “różne od” |
(1==1) & (1>2) |
#Symbol & oznacza “i” (koniunkcja warunków) |
(1==1) | (1>2) |
#Symbol | oznacza “lub” (alternatywa warunków) |
d==5 |
#Test na składowych wektora |
a>1 & a<=5 |
|
ind=(a>1 & a<=5) |
#Wynik testu jest przypisany do zmiennej ind |
is.vector(a) |
#Funkcja is.vector() zwracająca TRUE jeśli a jest wektorem i FALSE w przeciwnym przypadku |
is.numeric(a) |
|
is.character(a) |
|
mode(a) |
#Zwraca typ obiektu a |
a*a |
|
a[1]='test' |
a*a #Nie można mnożyć dwóch wektorów, które nie są
wektorami liczbowymi (wypróbować polecenie).
4.5 Wyodrębnianie podzbiorów danych
Podczas operacji na zbiorach danych w statystyce często potrzeba np. wyodrębnić osoby o określonych cechach (np. osoby płci męskiej w wieku od 30 do 35 lat pracujące na stanowiskach kierowniczych). Użycie pętli może wydawać się naturalne, ale nie jest optymalne z punktu widzenia czasu obliczeń. Lepiej jest używać operacji przedstawionych w poniższych przykładach. Ogólnie rzecz biorąc, podczas pracy z R należy unikać pętli tak bardzo, jak to tylko możliwe.
- przy pomocy funkcji which()
x=-5:5 |
|
x<0 |
|
ind=which(x<0) |
# ind zawiera numery ujemnych współrzędnych x. ‘ind’ to nazwa zmiennej, nie ma jakiegoś istotnego znaczenia. |
ind |
|
x[ind] |
|
x[-ind] |
#znak ‘-’ pozwala uzyskać dopełnienie zbioru indeksów (w tym wypadku numery nieujemnych współrzędnych x) |
- bez użycia funkcji which()
x=-5:5 |
|
ind=x>0 |
#Współrzędne ind przyjmują wartości logiczne TRUE (gdy x>0) i FALSE w przeciwnym przypadku) |
x[ind] |
#Zwraca wartości x większe od 0 (czyli te, dla których współrzędne ind miały wartość TRUE) |
x[x>=0] |
|
x[x<0]=10 |
#Zastąpienie wartości ujemnych x przez 10 |
- wartości brakujące
x=1:10 |
|
mean(x) |
|
x[10]=NA |
#NA (“Not Available”) jest stosowany do kodowania brakujących wartości (niekompletne zbiory danych) |
x |
|
mean(x) |
|
mean(x,na.rm = TRUE) |
#Oblicza średnią z elementów wektora x, pomijając wartości brakujące |
is.na(x) |
|
which(is.na(x)) |
- kilka przydatnych funkcji
Uwaga: poniżej zamieszczamy fragmenty wybrane polecenia oraz, poprzedzone znakami ##, to co powinno pojawić się w konsoli jako wynik operacji
## [1] 1 2 3 4 1 2 3 4
## [1] 1.4 1.4 3.0 3.0 5.0 5.0
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
## [1] 1.575 1.625 1.675 1.725 1.775 1.825 1.875 1.925 1.975 2.025 2.075 2.125
## [13] 2.175 2.225 2.275 2.325 2.375 2.425 2.475 2.525 2.575 2.625 2.675 2.725
## [25] 2.775 2.825 2.875 2.925 2.975 3.025 3.075 3.125 3.175 3.225 3.275 3.325
## [37] 3.375 3.425 3.475 3.525 3.575 3.625 3.675 3.725 3.775 3.825 3.875 3.925
## [49] 3.975 4.025 4.075 4.125 4.175 4.225 4.275 4.325 4.375 4.425 4.475 4.525
## [61] 4.575 4.625 4.675 4.725 4.775 4.825 4.875 4.925 4.975 5.025 5.075 5.125
## [1] 1 2 3 4
## [1] -2 5 7 10
## [1] 2 1 4 3
## [1] 2
## [1] 3
## [1] 10
## [1] 3
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
## [1] 5 2 10 7
## [1] 1.6094379 0.6931472 2.3025851 1.9459101
## Warning in sqrt(b): wyprodukowano wartości NaN
## [1] 2.236068 NaN 3.162278 2.645751
5 Zadania
Poniższe ćwiczenia należy wykonać bez użycia pętli!
Niech \(x = (7, 9, 13, 8, 4, 2, 16, 1, 6, 19, 15, 12, 19, 14, 8, 2, 19, 11, 18, 7)\). Wypisz:
- Drugi element wektora \(x\).
- Pierwsze pięć elementów wektora \(x\).
- Indeksy \(i\) współrzędnych wektora \(x\), dla których \(x_i >14\).
- Wszystkie elementy z wyjątkiem elementów na pozycjach 6, 10 i 12.
Używając tylko funkcji
rep()iseq(), wygeneruj następujące ciągi (możesz użyć funkcjic(), ale nie bezpośrednio (np. nie piszc(0,6,0,6,0,6)odpowiadając na pierwsze pytanie).- 0 6 0 6 0 6
- 1 4 7 10
- 1 2 3 1 2 3 1 2 3 1 2 3
- 1 2 2 3 3 3
- 1 1 1 2 2 3
- 1 5.5 10
- 1 1 1 1 2 2 2 2 3 3 3 3
- Utwórz wektor \(a = (2.5, 3, 1, 0, 4, -1)\).
- Posortuj wektor \(a\) rosnąco za
pomocą funkcji
sort(). Do czego służy funkcjaorder? Posortuj wektor \(a\) rosnąco używając funkcjiorder().
Obliczyć średnią harmoniczną wektora \(x = (7, 13, 3, 8, 12, 12, 20, 11)\).