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 Enter
em.
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
source
orazvisual
- 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
Enter
em.
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)\).