Dla kogo jest ten dokument? Materiał przeznaczony dla osób, które po raz pierwszy stykają się z językiem R i środowiskiem RStudio. Nie jest wymagana żadna wcześniejsza wiedza programistyczna.


Dlaczego R?

R to darmowy, otwartoźródłowy język programowania stworzony z myślą o analizie danych i statystyce. Używany jest przez naukowców, analityków, ekonomistów i data scientistów na całym świecie.

RStudio to wygodne środowisko (IDE), które sprawia, że praca z R jest prostsza i przyjemniejsza.

💡 Wskazówka: Aby uruchomić pojedynczą linię kodu w RStudio, ustaw na niej kursor i wciśnij Ctrl + Enter (Windows/Linux) lub Cmd + Enter (Mac).


1 Definiowanie zmiennych i typy danych

1.1 Operator przypisania

W R wartości przypisujemy do zmiennych za pomocą operatora <-. Możemy też używać =, ale <- jest konwencją preferowaną przez społeczność R.

imie        <- "Marcin"   # character – tekst
wiek        <- 47         # numeric   – liczba
wzrost_m    <- 1.80       # numeric   – liczba zmiennoprzecinkowa
czy_student <- FALSE      # logical   – wartość logiczna (TRUE/FALSE)
ocena       <- 5L         # integer   – liczba całkowita (sufiks L)

⚠️ Uwaga: R rozróżnia wielkie i małe litery! Imie i imie to dwie różne zmienne.

1.2 Sprawdzanie typów danych

Funkcja class() zwraca typ danej zmiennej:

class(imie)        # "character"
#> [1] "character"
class(wiek)        # "numeric"
#> [1] "numeric"
class(czy_student) # "logical"
#> [1] "logical"
class(ocena)       # "integer"
#> [1] "integer"

1.3 Wyświetlanie wartości

print(imie)
#> [1] "Marcin"
# cat() pozwala łączyć tekst i zmienne w jednej linii
cat("Imię:", imie, "| Wiek:", wiek, "lat\n")
#> Imię: Marcin | Wiek: 47 lat

1.4 Przegląd zmiennych w środowisku

ls()   # lista wszystkich zmiennych utworzonych w sesji
#> [1] "czy_student" "imie"        "ocena"       "wiek"        "wzrost_m"

Zapamiętaj – 4 podstawowe typy danych w R:

Typ Przykład Opis
character "Anna" Tekst, zawsze w cudzysłowie
numeric 3.14, 42 Liczby rzeczywiste
integer 5L Liczby całkowite
logical TRUE / FALSE Wartości logiczne

2 Podstawowe funkcje i operacje matematyczne

2.1 Działania arytmetyczne

a <- 15
b <- 4

a + b    # dodawanie        -> 19
#> [1] 19
a - b    # odejmowanie      -> 11
#> [1] 11
a * b    # mnożenie         -> 60
#> [1] 60
a / b    # dzielenie        -> 3.75
#> [1] 3.75
a %/% b  # dzielenie całkowite -> 3
#> [1] 3
a %% b   # reszta z dzielenia  -> 3
#> [1] 3
a ^ 2    # potęgowanie      -> 225
#> [1] 225
sqrt(a)  # pierwiastek kwadratowy
#> [1] 3.872983

2.2 Wbudowane funkcje matematyczne

abs(-42)              # wartość bezwzględna  -> 42
#> [1] 42
round(3.14159, 2)     # zaokrąglenie        -> 3.14
#> [1] 3.14
ceiling(2.1)          # zaokrąglenie w górę -> 3
#> [1] 3
floor(2.9)            # zaokrąglenie w dół  -> 2
#> [1] 2
log(100, base = 10)   # logarytm            -> 2
#> [1] 2
exp(1)                # e^1 ≈ 2.718282
#> [1] 2.718282

2.3 Funkcje statystyczne

x <- c(4, 8, 15, 16, 23, 42)

sum(x)      # suma
#> [1] 108
mean(x)     # średnia arytmetyczna
#> [1] 18
median(x)   # mediana
#> [1] 15.5
var(x)      # wariancja
#> [1] 182
sd(x)       # odchylenie standardowe
#> [1] 13.49074
min(x)      # minimum
#> [1] 4
max(x)      # maksimum
#> [1] 42
range(x)    # zakres (min i max)
#> [1]  4 42
length(x)   # liczba elementów
#> [1] 6

Funkcja summary() zwraca kompaktowe podsumowanie statystyczne:

summary(x)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    4.00    9.75   15.50   18.00   21.25   42.00

3 Operacje na wektorach

Wektor to podstawowa struktura danych w R – uporządkowany ciąg wartości tego samego typu.

3.1 Tworzenie wektorów

liczby       <- c(1, 2, 3, 4, 5)                    # wektor numeryczny
owoce        <- c("jablko", "gruszka", "sliwka")     # wektor tekstowy
logiczne     <- c(TRUE, FALSE, TRUE, TRUE)            # wektor logiczny

sekwencja    <- 1:10                                  # sekwencja 1–10
seq_parzyste <- seq(2, 20, by = 2)                   # co 2: 2, 4, 6, ..., 20
powtorzenia  <- rep(0, times = 5)                    # 0 0 0 0 0

# Podgląd
sekwencja
#>  [1]  1  2  3  4  5  6  7  8  9 10
seq_parzyste
#>  [1]  2  4  6  8 10 12 14 16 18 20

3.2 Indeksowanie

⚠️ Ważna różnica od innych języków: Indeksy w R zaczynają się od 1, nie od 0!

owoce[1]           # pierwszy element    -> "jablko"
#> [1] "jablko"
owoce[2:3]         # elementy 2 i 3      -> "gruszka" "sliwka"
#> [1] "gruszka" "sliwka"
owoce[-1]          # wszystkie BEZ pierwszego
#> [1] "gruszka" "sliwka"
liczby[liczby > 3] # filtrowanie: elementy > 3
#> [1] 4 5

3.3 Wektoryzacja – supermoc R

R automatycznie wykonuje operacje na każdym elemencie wektora — nie trzeba pisać pętli!

v1 <- c(1, 2, 3, 4, 5)
v2 <- c(10, 20, 30, 40, 50)

v1 + v2    # dodawanie element po elemencie
#> [1] 11 22 33 44 55
v1 * v2    # mnożenie element po elemencie
#> [1]  10  40  90 160 250
v1 ^ 2     # każdy element do potęgi 2
#> [1]  1  4  9 16 25
v2 / 10    # każdy element dzielony przez 10
#> [1] 1 2 3 4 5

3.4 Filtrowanie logiczne

v1 > 3          # zwraca wektor TRUE/FALSE
#> [1] FALSE FALSE FALSE  TRUE  TRUE
v1[v1 > 3]      # tylko elementy spełniające warunek
#> [1] 4 5
which(v1 > 3)   # indeksy elementów spełniających warunek
#> [1] 4 5

3.5 Operacje na tekstach

toupper(owoce)                    # zamiana na WIELKIE LITERY
#> [1] "JABLKO"  "GRUSZKA" "SLIWKA"
nchar(owoce)                      # liczba znaków w każdym słowie
#> [1] 6 7 6
paste(owoce, collapse = ", ")     # scalenie w jeden napis
#> [1] "jablko, gruszka, sliwka"
paste0("owoc_", 1:3)              # łączenie bez separatora
#> [1] "owoc_1" "owoc_2" "owoc_3"

4 Data Frame – tworzenie i manipulacja

Data Frame to tabela danych – najważniejsza struktura w R do analizy danych. Każda kolumna może mieć inny typ danych.

4.1 Tworzenie data frame

pracownicy <- data.frame(
  imie          = c("Anna", "Bartek", "Celina", "Dawid", "Ewa"),
  dzial         = c("IT", "HR", "IT", "Finanse", "HR"),
  wynagrodzenie = c(8500, 6200, 9100, 7400, 6800),
  staz_lat      = c(3, 7, 5, 2, 9),
  aktywny       = c(TRUE, TRUE, TRUE, FALSE, TRUE),
  stringsAsFactors = FALSE
)

pracownicy
imie dzial wynagrodzenie staz_lat aktywny
Anna IT 8500 3 TRUE
Bartek HR 6200 7 TRUE
Celina IT 9100 5 TRUE
Dawid Finanse 7400 2 FALSE
Ewa HR 6800 9 TRUE

4.2 Podgląd danych

head(pracownicy, 3)   # pierwsze 3 wiersze
imie dzial wynagrodzenie staz_lat aktywny
Anna IT 8500 3 TRUE
Bartek HR 6200 7 TRUE
Celina IT 9100 5 TRUE
str(pracownicy)       # struktura ramki danych
#> 'data.frame':    5 obs. of  5 variables:
#>  $ imie         : chr  "Anna" "Bartek" "Celina" "Dawid" ...
#>  $ dzial        : chr  "IT" "HR" "IT" "Finanse" ...
#>  $ wynagrodzenie: num  8500 6200 9100 7400 6800
#>  $ staz_lat     : num  3 7 5 2 9
#>  $ aktywny      : logi  TRUE TRUE TRUE FALSE TRUE
summary(pracownicy)   # statystyki podsumowujące
#>      imie              dzial           wynagrodzenie     staz_lat  
#>  Length:5           Length:5           Min.   :6200   Min.   :2.0  
#>  Class :character   Class :character   1st Qu.:6800   1st Qu.:3.0  
#>  Mode  :character   Mode  :character   Median :7400   Median :5.0  
#>                                        Mean   :7600   Mean   :5.2  
#>                                        3rd Qu.:8500   3rd Qu.:7.0  
#>                                        Max.   :9100   Max.   :9.0  
#>   aktywny       
#>  Mode :logical  
#>  FALSE:1        
#>  TRUE :4        
#>                 
#>                 
#> 
nrow(pracownicy)  # liczba wierszy
#> [1] 5
ncol(pracownicy)  # liczba kolumn
#> [1] 5
dim(pracownicy)   # wymiary: wiersze x kolumny
#> [1] 5 5

4.3 Dostęp do kolumn i wierszy

# Dostęp do kolumny – 3 sposoby (wszystkie równoważne):
pracownicy$imie
#> [1] "Anna"   "Bartek" "Celina" "Dawid"  "Ewa"
pracownicy[["wynagrodzenie"]]
#> [1] 8500 6200 9100 7400 6800
pracownicy[, 3]
#> [1] 8500 6200 9100 7400 6800
pracownicy[1, ]                                         # cały wiersz 1
imie dzial wynagrodzenie staz_lat aktywny
Anna IT 8500 3 TRUE
pracownicy[2, 3]                                        # wiersz 2, kolumna 3
#> [1] 6200
pracownicy[1:3, c("imie", "wynagrodzenie")]             # podzbiór
imie wynagrodzenie
Anna 8500
Bartek 6200
Celina 9100

4.4 Filtrowanie wierszy

# Pracownicy z działu IT
pracownicy[pracownicy$dzial == "IT", ]
imie dzial wynagrodzenie staz_lat aktywny
1 Anna IT 8500 3 TRUE
3 Celina IT 9100 5 TRUE
# Pracownicy z wynagrodzeniem powyżej 7000 PLN
pracownicy[pracownicy$wynagrodzenie > 7000, ]
imie dzial wynagrodzenie staz_lat aktywny
1 Anna IT 8500 3 TRUE
3 Celina IT 9100 5 TRUE
4 Dawid Finanse 7400 2 FALSE
# Aktywni pracownicy ze stażem > 3 lata (operator AND: &)
pracownicy[pracownicy$aktywny == TRUE & pracownicy$staz_lat > 3, ]
imie dzial wynagrodzenie staz_lat aktywny
2 Bartek HR 6200 7 TRUE
3 Celina IT 9100 5 TRUE
5 Ewa HR 6800 9 TRUE

4.5 Dodawanie kolumn

# Premia = 10% wynagrodzenia
pracownicy$premia <- pracownicy$wynagrodzenie * 0.10

# Poziom Senior/Junior na podstawie warunku
pracownicy$poziom <- ifelse(pracownicy$wynagrodzenie >= 8000, "Senior", "Junior")

pracownicy
imie dzial wynagrodzenie staz_lat aktywny premia poziom
Anna IT 8500 3 TRUE 850 Senior
Bartek HR 6200 7 TRUE 620 Junior
Celina IT 9100 5 TRUE 910 Senior
Dawid Finanse 7400 2 FALSE 740 Junior
Ewa HR 6800 9 TRUE 680 Junior

4.6 Sortowanie

# Sortowanie malejące po wynagrodzeniu
pracownicy[order(pracownicy$wynagrodzenie, decreasing = TRUE), ]
imie dzial wynagrodzenie staz_lat aktywny premia poziom
3 Celina IT 9100 5 TRUE 910 Senior
1 Anna IT 8500 3 TRUE 850 Senior
4 Dawid Finanse 7400 2 FALSE 740 Junior
5 Ewa HR 6800 9 TRUE 680 Junior
2 Bartek HR 6200 7 TRUE 620 Junior

4.7 Agregacja danych

# Średnie wynagrodzenie w każdym dziale
aggregate(wynagrodzenie ~ dzial, data = pracownicy, FUN = mean)
dzial wynagrodzenie
Finanse 7400
HR 6500
IT 8800
# Usunięcie kolumny
pracownicy$premia <- NULL

5 Grafika podstawowa – pakiet graphics

Pakiet graphics jest wbudowany w R i pozwala tworzyć różnorodne wykresy bez instalowania dodatkowych bibliotek.

5.1 Wykres liniowy – plot()

miesiace <- 1:12
sprzedaz <- c(120, 135, 150, 142, 160, 175, 180, 190, 165, 155, 140, 200)

plot(miesiace, sprzedaz,
     type = "b",            # "b" = punkty + linie
     col  = "steelblue",
     pch  = 16,             # kształt punktu: 16 = wypełnione kółko
     lwd  = 2,              # grubość linii
     xlab = "Miesiąc",
     ylab = "Sprzedaż (tys. PLN)",
     main = "Sprzedaż miesięczna",
     xaxt = "n")            # wyłączenie domyślnej osi X

axis(1, at = 1:12, labels = month.abb)  # własne etykiety osi X

abline(h = mean(sprzedaz), col = "red", lty = 2, lwd = 1.5)
legend("topleft", legend = "Średnia", col = "red", lty = 2, bty = "n")
Rys. 1 – Sprzedaż miesięczna z linią średniej

Rys. 1 – Sprzedaż miesięczna z linią średniej

💡 Parametry plot() warte zapamiętania: type – rodzaj wykresu ("l" = linia, "p" = punkty, "b" = oba) pch – symbol punktu (1–25) lwd – grubość linii col – kolor (nazwa lub kod hex, np. "#2196F3")

5.2 Wykres słupkowy – barplot()

dzialy <- aggregate(wynagrodzenie ~ dzial, data = pracownicy, FUN = mean)

bp <- barplot(dzialy$wynagrodzenie,
              names.arg = dzialy$dzial,
              col       = c("coral", "skyblue", "palegreen"),
              border    = "white",
              ylim      = c(0, 12000),
              xlab      = "Dział",
              ylab      = "Średnie wynagrodzenie (PLN)",
              main      = "Wynagrodzenie wg działu")

# Wartości nad słupkami
text(x      = bp,
     y      = dzialy$wynagrodzenie + 300,
     labels = paste0(round(dzialy$wynagrodzenie), " PLN"),
     cex    = 0.9,
     font   = 2)
Rys. 2 – Średnie wynagrodzenie wg działu

Rys. 2 – Średnie wynagrodzenie wg działu

5.3 Wykres kołowy – pie()

udzial_dzialu <- table(pracownicy$dzial)

pie(udzial_dzialu,
    col    = c("coral", "skyblue", "palegreen"),
    labels = paste0(names(udzial_dzialu), "\n(", udzial_dzialu, " os.)"),
    main   = "Struktura zatrudnienia")
Rys. 3 – Struktura zatrudnienia wg działu

Rys. 3 – Struktura zatrudnienia wg działu

5.4 Histogram – hist()

set.seed(42)  # ziarno losowości – gwarantuje powtarzalność wyników
dane_norm <- rnorm(n = 200, mean = 170, sd = 10)

hist(dane_norm,
     breaks = 20,
     col    = "steelblue",
     border = "white",
     freq   = FALSE,         # gęstość zamiast częstości
     xlab   = "Wzrost (cm)",
     ylab   = "Gęstość",
     main   = "Rozkład wzrostu (n = 200)")

# Nałożenie krzywej teoretycznej
curve(dnorm(x, mean = mean(dane_norm), sd = sd(dane_norm)),
      add = TRUE, col = "red", lwd = 2)

legend("topright", legend = "Krzywa normalna", col = "red", lwd = 2, bty = "n")
Rys. 4 – Histogram wzrostu z nałożoną krzywą normalną

Rys. 4 – Histogram wzrostu z nałożoną krzywą normalną

💡 set.seed() ustawia “ziarno” generatora liczb losowych. Dzięki temu za każdym razem, gdy uruchomisz kod, otrzymasz identyczne wyniki losowe — ważne dla powtarzalności analiz!

5.5 Wykres punktowy – plot() (scatter plot)

set.seed(7)
wzrost <- rnorm(50, 175, 10)
masa   <- 0.45 * wzrost + rnorm(50, 0, 5)

plot(wzrost, masa,
     col  = "darkorchid",
     pch  = 19,
     cex  = 0.9,
     xlab = "Wzrost (cm)",
     ylab = "Masa ciała (kg)",
     main = "Wzrost vs. masa ciała")

# Linia regresji liniowej
abline(lm(masa ~ wzrost), col = "black", lwd = 2)

legend("topleft", legend = "Linia regresji", col = "black", lwd = 2, bty = "n")
Rys. 5 – Zależność wzrostu i masy ciała z linią regresji

Rys. 5 – Zależność wzrostu i masy ciała z linią regresji

5.6 Boxplot – boxplot()

it_wynagrodzenia  <- c(8500, 9100, 8200, 9500, 7800, 10200)
hr_wynagrodzenia  <- c(6200, 6800, 6500, 7100, 6000, 7300)
fin_wynagrodzenia <- c(7400, 7800, 8100, 7200, 8500, 7600)

boxplot(list(IT      = it_wynagrodzenia,
             HR      = hr_wynagrodzenia,
             Finanse = fin_wynagrodzenia),
        col    = c("steelblue", "coral", "palegreen"),
        border = "gray30",
        xlab   = "Dział",
        ylab   = "Wynagrodzenie (PLN)",
        main   = "Rozkład wynagrodzeń wg działu")

# Nałożenie punktów (jitter = lekkie losowe przesunięcie dla czytelności)
stripchart(list(it_wynagrodzenia, hr_wynagrodzenia, fin_wynagrodzenia),
           add      = TRUE,
           vertical = TRUE,
           method   = "jitter",
           pch      = 16,
           col      = "gray20",
           cex      = 0.8)
Rys. 6 – Rozkład wynagrodzeń wg działu (boxplot)

Rys. 6 – Rozkład wynagrodzeń wg działu (boxplot)

💡 Jak czytać boxplot? - Gruba linia = mediana - Pudełko = zakres między 1. a 3. kwartylem (IQR) - Wąsy = dane do 1.5 × IQR od krawędzi pudełka - Punkty poza wąsami = potencjalne wartości odstające


Podsumowanie

Temat Kluczowe funkcje / pojęcia
Zmienne <-, =, class(), ls()
Typy danych character, numeric, integer, logical
Funkcje matematyczne sum(), mean(), sd(), round(), sqrt()
Wektory c(), seq(), rep(), 1:n
Indeksowanie x[1], x[2:5], x[x > 0], which()
Data Frame data.frame(), str(), head(), aggregate()
Grafika plot(), barplot(), hist(), boxplot(), pie()

🎉 Brawo! Poznałeś/aś podstawy języka R. Kolejnym krokiem może być zapoznanie się z pakietem ggplot2 do zaawansowanej wizualizacji danych oraz dplyr do efektywnej manipulacji tabelami — oba są częścią ekosystemu tidyverse.


Dokument wygenerowany w R Markdown · 08.04.2026