R. Peng, R Programming link
Środowisko R można wykorzystac do właściwie dowolnych obliczeń arytmetycznych na liczbach. To co jest wyświetlane w szarej ramce wpisane należy wpisać do konsoli i po wciśnieciu enter otrzymamy to co jest w białej ramce (po ##).
1+15
## [1] 16
4/2
## [1] 2
6^3
## [1] 216
625^(.5)
## [1] 25
(1+3)/(2+3^2)
## [1] 0.3636364
Możemy korzystać z ogromnej ilości funkcji wbudowanych w R oraz tworzyć własne. Funkcję wywołujemy wpisując jej nazwę oraz argumenty w nawiasie okrągłym.
-pierwiastek:
sqrt(64)
## [1] 8
-funkcja eksponencjalna
exp(2)
## [1] 7.389056
Aby dowiedzieć się więcej na temat danej funkcji wpisujemy ?nazwa_funkcji. Niektóre funkcje mają więcej argumentów, np. funkcja licząca logarytm (log) ma dwa argumenty (liczbę, której logarytm chcemy policzy.c oraz podstawę logarytmu). W takiej sytuacji musimy musimy podac dwa argumenty.
liczymy \(log_2 (16)\):
log(16, 2)
## [1] 4
Spoglodając do opisu funkcji log możemy dowiedzieć się, że liczba logarytmowana to argument x, a podstawa to argument base. Wywołując funkcję możemy odwołać się do tych nazw nie pamietając o kolejności argumentów.
log(x=27, base=3)
## [1] 3
log(base=3, x=27)
## [1] 3
Niektóre agumenty mają wartości domyślne (właściwie to jest bardzo częsty przypadek). W przypadku logarytmu, argument base ma wartość domyślną równą e. Zatem jeżeli chcemy policzyć logarytm naturalny nie musimy wpisywać podstawy.
log(2)
## [1] 0.6931472
log(x=12)
## [1] 2.484907
Jednak jeżeli funkcja nie ma wartości domyślnej do argumentu, nie wpisując wartości otrzymamy błąd. Np. log(base=5).
Wiele funkcji nie ma argumentów, lub wszystkie jej argumenty mają wartości domyślne, i tak możemy dowiedzieć się w jakim katalogu pracujemy wpisując getwd() lub wyświetlając wszystkie obiekty, które przechowujemy w naszym środowisku ls().
getwd()
## [1] "C:/Users/Artur/Dropbox/AGH/dydaktyka/statystyka ZiP/2015-2016/R"
ls()
## character(0)
Jeszcze nie stworzyliśmy ani nie wczytaliśmy nic do naszego środowiska, dlatego wyświetla pustą listę.
Podstawowymi wartościami w R są wektory. Podstawową funkcją, która tworzy wektor jest c().
c(1,3,11,-1,.3)
## [1] 1.0 3.0 11.0 -1.0 0.3
Pracując na wektorach, przeważnie chcemy przypisać jakiejś zmiennej wartości. Stórzmy zatem dwa 5-elementowe wektory x i y. Do przypisywania wartości służy operator <- (lub ->).
x<-c(2, -1, 3, 1.5, -.5)
y<-c(1, 2, 3, -1, -5)
Tym razem po wpisaniu komend do consoli nie dostaliśmy żadnej odpowiedzi, ale możemy odwołać sie do zmiennych.
x; y
## [1] 2.0 -1.0 3.0 1.5 -0.5
## [1] 1 2 3 -1 -5
Wszystkie podstawowe funkcje liczbowe możemy stosować do wektorów. Działania są wykonywane dla pierwszych elementów wektorów i wartość jest pierwszym elementem wektora wyniku itd. Innymi słowy jest działanie wyraz po wyrazie.
exp(x)
## [1] 7.3890561 0.3678794 20.0855369 4.4816891 0.6065307
x+y
## [1] 3.0 1.0 6.0 0.5 -5.5
x/y
## [1] 2.0 -0.5 1.0 -1.5 0.1
x^y
## [1] 2.0000000 1.0000000 27.0000000 0.6666667 -32.0000000
Wiele funkcji jako argument (lub kilka argumentów) ma wektor. Podstawowe to np. suma sum(), średnia arytmetyczna mean().
sum(x); sum(y)
## [1] 5
## [1] 0
mean(x); mean(y)
## [1] 1
## [1] 0
Dzieki temu bardzo szybko możemy policzyć np. wariancję x:
mean((x-mean(x))^2); mean((y-mean(y))^2)
## [1] 2.3
## [1] 8
sum((x-mean(x))^2)/length(x); sum((y-mean(y))^2)/length(y)
## [1] 2.3
## [1] 8
sum((x-mean(x))^2)/(length(x)-1); sum((y-mean(y))^2)/(length(y)-1)
## [1] 2.875
## [1] 10
Oczywiście jest też funckja var(), która oblicza wariancję dla wartości z wektora.
var(x); var(y)
## [1] 2.875
## [1] 10
W R rozróżniamy 6 podstawowych typów obiektów (które przeważnie są elementami wektora):
"to jest napis".1+2i.2L.TRUE lub FALSE, przekształcane są w odpowiednio 1 i 0.Rozróżnienie jest ważne, dlatego, że wektory muszą być jednorodne ze względu na obiekty (wszystkie elementy wektora muszą mieć ten sam typ). Typy wypisałem w nieprzypadkowej kolejności, zamiana wektora, który ma wyższy typ bezproblemowo zamienimy na tym niższy, odwrotna operacja przeważnie nie jest możliwa. Jezeli spróbujemy stworzyć wektor niejednorodny, R wybierze obiekt najniższego rzędu w tym wektorze i pozostałe lementy przekształci w ten tym.
mix_vect_1<-c(1L, TRUE, 2+3i)
typeof(mix_vect_1); mix_vect_1
## [1] "complex"
## [1] 1+0i 1+0i 2+3i
mix_vect_2<-c(1,2, 'napis')
typeof(mix_vect_2); mix_vect_2
## [1] "character"
## [1] "1" "2" "napis"
Z punktu widzenia tego kursu najważniejsze są wektory numeryczne i logiczne (okazjonalnie będziemy korzystać z napisów).
W wyniku niektórych operacji możemy otrzymac nieksończoność Inf. Nieskończoność możemy też używać do obliczeń.
1/0
## [1] Inf
.99^Inf
## [1] 0
Jednak niektórych działań nie da się wykonać i otrzymamy liczbe nioznaczoną.
0/0
## [1] NaN
(-1)^.1
## [1] NaN
Jeżeli chcielibysmy przekształcić napis w liczbę, a napis nie będzie liczba otrzymamy również wartość nieoznaczoną:
as.numeric(mix_vect_2)
## Warning: pojawiły się wartości NA na skutek przekształcenia
## [1] 1 2 NA
Widzimy, że dwa pierwsze lementy przekształcono w liczny, a trzeci został zastąpiony przez NA. Różnicą między NaN i NA nie będziemy się zajmować i obie będziemy traktować jak wartości brakujące lub błędne w zalezności od kontekstu.
Wiele obiektów w R posiada atrybuty, w szczególności wektory. Przykładowe atrybuty to:
Wszystkie atrybuty danego obiektu możemy uzyskać dzięki funkcji attributes().
Przypiszemy nazwy wartościom w wektorze mix_vect_1, odpowiadjące jego klasie.
names(mix_vect_1)
## NULL
names(mix_vect_1)<-c('integer', 'logical', 'complex')
names(mix_vect_1)
## [1] "integer" "logical" "complex"
mix_vect_1
## integer logical complex
## 1+0i 1+0i 2+3i
Aby otrzymać konkretną współrzędna wektora odwołujemy sie do niego w nawiasie kwadratowym. Trzeci element wektora x to:
x[3]
## [1] 3
Aby otrzymać wektor, składający się z wektora x bez jego trzeciego elementu poprzedzamy to znakiem minus:
x[-3]
## [1] 2.0 -1.0 1.5 -0.5
Możemy odwołać się do wektora, składającego się z trzeciego i piątego elementu x:
x[c(3,5)]
## [1] 3.0 -0.5
Ważne: odwołanie jest wektorem a nie ciągiem liczb!
Podstawowe operatory logiczne to koninkcja &, alternatywa | i negacja !. W zastosowaniach najczęstsze waunki, które nas interesują to czy zachodzi równość ==, nierówność !=, mniejszość <, niewiększość <=, większość > i niemniejszość >=.
Sprawdźmy czy 2 jest większe od 3:
2>3
## [1] FALSE
Możemy w jednej komendzie sprawdzić, które elementy x są ujemne:
x<0
## [1] FALSE TRUE FALSE FALSE TRUE
lub, które lementy x są niemnijesze niż odpowiednie elementy y:
x>=y
## [1] TRUE FALSE TRUE TRUE TRUE
Dzięki wektorom logicznym, możemy otrzymać wszystkie dodatnie wartości z wektora y:
y[y>0]
## [1] 1 2 3
Szczególnie wygodne i użyteczne jest używanie warunków logicznych do konstrukcji podzbiorów. Jakie wartości przyjmuje x jeżeli y jest dodatni?
x[y>0]
## [1] 2 -1 3
Przykładowe statystyki opisowe, dla których są funkcje w podstawowym pakiecie R to:
mean()median()sd()aad()quantilePrzykładowe statystyki opisowe, dla których nie ma funkcji w podstawowym pakiecie R to:
Wczyutajmy dane mtcars, które są dostępny w podstawowym pakiecie R.
data(mtcars)
str(mtcars)
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
Jest to ramka danych (data.frame) składająca się z 32 obserwacji i 11 wartości dla każdej z nich. Są to dane techniczne 32 modeli samochodów.
Ramke danych możemy traktować jak dwuwymiarową tablicę i odwoływać się do elementów przez nawias kwadratowy. Gdzie na pierwszej współrzędnej podajemy które wiersze mają być wyswietlone, a na drugiej, które kolumny. Po pozostawieniu pustego wymiaru, wszystkie lementy zostana wyswietlone.
mtcars[1,c(1,2)]
## mpg cyl
## Mazda RX4 21 6
mtcars[,3]
## [1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6
## [12] 275.8 275.8 275.8 472.0 460.0 440.0 78.7 75.7 71.1 120.1 318.0
## [23] 304.0 350.0 400.0 79.0 120.3 95.1 351.0 145.0 301.0 121.0
Możemy odwołać sie do zmiennej w danych przez jej nazwę iznak dolara:
#liczba cylindrów w kolejnych samochodach
mtcars$cyl
## [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
Policzmy średnią masę samochodów z bazy mtcars
mean(mtcars$wt)
## [1] 3.21725
Policzmy teraz średnią masę dla samochodów z 8 cylindrami:
#dla jasności wprowadzamy nowe wektory odpowiadające wadze i ilości cylindrów
weight<-mtcars$wt
cylinders<-mtcars$cyl
mean(weight[cylinders==8])
## [1] 3.999214
Na histogramie objętości silników, widzimy, że dane są lekko niesymetryczne:
hist(mtcars$disp, main="Histogram", col=2, xlab="objetość (cale sześcienne)", ylab="ilość")
abline(v=mean(mtcars$disp), lw=3)
Policzmy zatem skośność:
#dla wygody tworzymy nową zmienną
disp<-mtcars$disp
#liczmy średnią
disp.mean<-mean(disp)
#i odchylenia od średniej
disp.dev<-disp-disp.mean
#trzecia potęga odchyleń i srednia
disp.dev.3<-disp.dev^3
#to jest trzeci moment centralny
disp.dev.3.mean<-mean(disp.dev.3)
#skośność
disp.dev.3.mean/sd(disp)^3
## [1] 0.381657