Programowanie w R

Dariusz Brzeziński

Część I

Agenda

  • Krótka historia R
  • Wady i zalety R
  • Podstawowe typy
  • Interakcja z konsolą

Slajdy oparte o materiały stworzone przez Rogera Penga z Johns Hopkins Bloomberg School of Public Health.

Język S

  • S to język programowania dla statystyków
  • Powstał w 1976 w Bell Labs
  • Najpierw zaimplementowany w Fortranie, później przepisany na C
  • Dla zainteresowanych: pełna historia

Język R

  • R to dialekt języka S
  • Powstał w 1991 r.
  • Od 1995 na licencji GNU GPL
  • Ta prezentacja została skompilowana za pomocą języka R w wersji 3.5.2 wydanego 20.12.2018

Cechy R

  • Aktywnie rozwijany, coraz popularniejszy
  • Interaktywny
  • Funkcjonalności podzielone na pakiety
  • Posiada szereg dobrych pakietów do wizualizacji danych
  • Wolny i darmowy

Wady R

  • Oparty na 40-letniej technologii
  • Nie tak dobre wsparcie dla wizualizacji 3D*
  • Rozwijany przez użytkowników
  • Obiekty trzymane w pamięci operacyjnej
  • Nie jest idealny do wszystkiego

Typy danych

R posiada pięć typów podstawowych:

  • character
  • numeric
  • integer
  • complex
  • logical

Podstawowym typem złożonym jest vector, który jest strukturą przechowującą elementy jednego typu

Literały liczbowe

  • Liczby w R są domyślnie traktowane jako liczby zmiennoprzecinkowe (numeric)
  • Aby dostać typ całkowitoliczbowy trzeba dodać końcówkę L (integer)
  • Dodatkowo istnieją literały Inf (nieskończoność) i NaN (not a number)

Atrybuty

Obiekty w R mogą mieć atrybuty, np.:

  • names, dimnames
  • dimensions (np. macierze, tablice)
  • class
  • length
  • inne, zdefiniowane przez użytkownika metadane

Atrybuty można odczytać/zapisać za pomocą funkcji attributes().

Konsola

R jest językiem interaktywnym, gdzie w konsoli można bezpośrednio wpisywać wyrażenia. Symbol <- oznacza operator przypisania (symbol = też w większości kontekstów zadziala).

> x <- 1
> print(x)
[1] 1
> x
[1] 1
> msg <- "hello"

Znak # rozpoczyna komentarz jednowierszowy.

Konsola

Po wpisaniu wyrażenia do konsoli, R je przetwarza i zwraca jego wynik. Jeśli wynik nie jest przypisany do zmiennej, z reguły zostanie wypisany na konsolę.

> x <- 5   ## nic się nie dzieje
> x        ## niejawne wypisanie na konsolę
[1] 5
> print(x) ## jawne wypisanie na konsolę
[1] 5

[1] oznacza, że x jest wektorem, którego pierwszym elementem jest 5.

Tworzenie wektorów

Funkcja c() pozwala łączyć obiekty w wektory.

> x <- c(0.5, 0.6)       ## numeric
> x <- c(TRUE, FALSE)    ## logical
> x <- c(T, F)           ## logical
> x <- c("a", "b", "c")  ## character
> x <- 9:29              ## integer
> x <- c(1+0i, 2+4i)     ## complex

Można też korzystać z konstruktora vector().

> vector("numeric", length = 10) 
 [1] 0 0 0 0 0 0 0 0 0 0

Mieszanie typów w wektorze

Kończy się niejawnym rzutowaniem…

> x <- c(1.7, "a")   ## character
> x <- c(TRUE, 2)    ## numeric
> x <- c("a", TRUE)  ## character

… lub wymaga jawnego rzutowania

> y <- 0:6
> class(y)
[1] "integer"
> as.numeric(y)
[1] 0 1 2 3 4 5 6
> as.logical(y)
[1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
> as.character(y)
[1] "0" "1" "2" "3" "4" "5" "6"

Jawne rzutowanie

Jeśli nie ma sensu prowadzi do NA, czyli brakujących wartości.

> x <- c("a", "b", "c")
> as.numeric(x)
[1] NA NA NA
Warning message:
NAs introduced by coercion
> as.logical(x)
[1] NA NA NA
> as.complex(x)
[1] 0+0i 1+0i 2+0i 3+0i 4+0i 5+0i 6+0i

Macierze

Obiekty typu matrix to wektory z atrybutem dimension. Atrybut dimension też jest wektorem o długości 2 (nrow, ncol).

> m <- matrix(nrow = 2, ncol = 3) 
> m
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA
> dim(m)
[1] 2 3
> attributes(m)
$dim
[1] 2 3

Funkcje cbind i rbind

Macierze można również tworzyć za pomocą funkcji cbind() i rbind().

> x <- 1:3
> y <- 10:12
> cbind(x, y)
     x  y 
[1,] 1 10 
[2,] 2 11 
[3,] 3 12
> rbind(x, y) 
  [,1] [,2] [,3]
x    1    2    3
y   10   11   12

Listy

Obiekty typu list to wektory, które mogą przechowywać elementy różnych typów.

> list(1, "a", TRUE, 1 + 4i) 
[[1]]
[1] 1

[[2]] 
[1] "a"

[[3]]
[1] TRUE

[[4]]
[1] 1+4i

Data frame'y

Typ data frame pozwala przechowywać dane tabelaryczne różnych typów.

> x <- data.frame(foo = 1:4, bar = c(T, T, F, F)) 
> x
  foo   bar
1   1  TRUE
2   2  TRUE
3   3 FALSE
4   4 FALSE
> nrow(x)
[1] 4
> ncol(x)
[1] 2

Typy wyliczeniowe

Typy wyliczeniowe kryją się w R pod typem factor. Kolejne wartości to poziomy (levels), gdzie każdy poziom to tak naprawdę liczba całkowita i odpowiadający jej łańcuch znaków. Typy wyliczeniowe mogą być nieuporządkowane (zmienne nominalne) lub uporządkowane (zmienne porządkowe).

Typy wyliczeniowe

> x <- factor(c("yes", "yes", "no", "yes", "no")) 
> x
[1] yes yes no yes no
Levels: no yes
> table(x) 
x
no yes 
 2   3
> unclass(x)
[1] 2 2 1 2 1
attr(,"levels")
[1] "no"  "yes"

Brakujące wartości

Brakujące wartości w R są oznaczane NA (not available). Wartość NaN też jest wartością brakującą.

  • is.na() sprawdza czy obiekt jest NA
  • is.nan() sprawdza czy obiekt jest NaN
  • wartości NA mają swój atrybut class, a zatem są liczbowe NA, tekstowe NA, itd.
  • Wartość NaN jest wartością NA, ale nie vice versa

Brakujące wartości

> x <- c(1, 2, NA, 10, 3)
> is.na(x)
[1] FALSE FALSE  TRUE FALSE FALSE
> is.nan(x)
[1] FALSE FALSE FALSE FALSE FALSE
> x <- c(1, 2, NaN, NA, 4)
> is.na(x)
[1] FALSE FALSE  TRUE  TRUE FALSE
> is.nan(x)
[1] FALSE FALSE  TRUE FALSE FALSE

Podsumowanie

  • R to interaktywny język programowania do analizy danych
  • Typy podstawowe: numeric, logical, character, integer, complex
  • Podstawowe struktury: vector, matrix, list, data frame
  • Typy wyliczeniowe
  • Brakujące wartości

Co teraz?




Teraz zaczniemy się uczyć R w konsoli!

Swirl.pl

Materiały do ćwiczeń z R będą w formie interaktywnych tutoriali. Do ich wykonania potrzebne będą:

  • najnowsza wersja R
  • RStudio
  • paczki devtools i swirl.pl
  • na windowsie warto też zainstalować RTools

Swirl.pl

Instalacja krok po kroku:

install.packages("devtools")
devtools::install_github("dabrze/swirl")
W razie problemów z instalacją devtools na linuxie: zainstalować curl z poziomu terminala.

Aby zacząć kurs wystarczy:

library(swirl.pl) ## załadować pakiet
swirl()           ## uruchomić swirla

Swirl.pl

Jeśli znajdziecie jakieś błędy niejasności czy literówki, prosiłbym o zgłoszenie tego.

W razie nieobecności na zajęciach należy nadrobić zaległe kursy swirla, gdyż materiał tam zawarty będzie potrzebny do pomyślnego zaliczenia kartkówek.

Na następne zajęcia obowiązuje pierwsze osiem lekcji z moduły Programowanie w R.




Do roboty!