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.
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).
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.
Funkcja class() zwraca typ danej zmiennej:
#> [1] "character"
#> [1] "numeric"
#> [1] "logical"
#> [1] "integer"
#> [1] "Marcin"
#> Imię: Marcin | Wiek: 47 lat
#> [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 |
#> [1] 19
#> [1] 11
#> [1] 60
#> [1] 3.75
#> [1] 3
#> [1] 3
#> [1] 225
#> [1] 3.872983
#> [1] 42
#> [1] 3.14
#> [1] 3
#> [1] 2
#> [1] 2
#> [1] 2.718282
#> [1] 108
#> [1] 18
#> [1] 15.5
#> [1] 182
#> [1] 13.49074
#> [1] 4
#> [1] 42
#> [1] 4 42
#> [1] 6
Funkcja summary() zwraca kompaktowe podsumowanie
statystyczne:
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 4.00 9.75 15.50 18.00 21.25 42.00
Wektor to podstawowa struktura danych w R – uporządkowany ciąg wartości tego samego typu.
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
#> [1] 2 4 6 8 10 12 14 16 18 20
⚠️ Ważna różnica od innych języków: Indeksy w R zaczynają się od 1, nie od 0!
#> [1] "jablko"
#> [1] "gruszka" "sliwka"
#> [1] "gruszka" "sliwka"
#> [1] 4 5
R automatycznie wykonuje operacje na każdym elemencie wektora — nie trzeba pisać pętli!
#> [1] 11 22 33 44 55
#> [1] 10 40 90 160 250
#> [1] 1 4 9 16 25
#> [1] 1 2 3 4 5
#> [1] FALSE FALSE FALSE TRUE TRUE
#> [1] 4 5
#> [1] 4 5
#> [1] "JABLKO" "GRUSZKA" "SLIWKA"
#> [1] 6 7 6
#> [1] "jablko, gruszka, sliwka"
#> [1] "owoc_1" "owoc_2" "owoc_3"
Data Frame to tabela danych – najważniejsza struktura w R do analizy danych. Każda kolumna może mieć inny typ danych.
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 |
| imie | dzial | wynagrodzenie | staz_lat | aktywny |
|---|---|---|---|---|
| Anna | IT | 8500 | 3 | TRUE |
| Bartek | HR | 6200 | 7 | TRUE |
| Celina | IT | 9100 | 5 | TRUE |
#> '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
#> 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
#>
#>
#>
#> [1] 5
#> [1] 5
#> [1] 5 5
#> [1] "Anna" "Bartek" "Celina" "Dawid" "Ewa"
#> [1] 8500 6200 9100 7400 6800
#> [1] 8500 6200 9100 7400 6800
| imie | dzial | wynagrodzenie | staz_lat | aktywny |
|---|---|---|---|---|
| Anna | IT | 8500 | 3 | TRUE |
#> [1] 6200
| imie | wynagrodzenie |
|---|---|
| Anna | 8500 |
| Bartek | 6200 |
| Celina | 9100 |
| imie | dzial | wynagrodzenie | staz_lat | aktywny | |
|---|---|---|---|---|---|
| 1 | Anna | IT | 8500 | 3 | TRUE |
| 3 | Celina | IT | 9100 | 5 | TRUE |
| 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 |
# 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 |
# 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 |
graphicsPakiet graphics jest wbudowany w R i pozwala tworzyć
różnorodne wykresy bez instalowania dodatkowych bibliotek.
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
💡 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")
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
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
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ą
💡 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!
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
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)
💡 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
| 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