3  Ramki danych

Ramka danych to serce analizy — odpowiednik arkusza kalkulacyjnego Excel. Każda kolumna to wektor (może mieć inny typ danych), każdy wiersz to jedna obserwacja (np. jeden pracownik, jeden kraj, jeden rok).

3.1 Tworzenie ramki danych

library(dplyr)

# Tworzenie ramki danych ręcznie
pracownicy <- data.frame(
  imie       = c("Anna", "Piotr", "Kasia", "Marek", "Zofia"),
  pensja     = c(4500, 5200, 4800, 6100, 5500),
  dzial      = c("IT", "Finanse", "IT", "HR", "Finanse"),
  staz_lat   = c(3, 7, 2, 10, 5),
  czy_menedz = c(FALSE, TRUE, FALSE, TRUE, FALSE)
)

pracownicy
#>    imie pensja   dzial staz_lat czy_menedz
#> 1  Anna   4500      IT        3      FALSE
#> 2 Piotr   5200 Finanse        7       TRUE
#> 3 Kasia   4800      IT        2      FALSE
#> 4 Marek   6100      HR       10       TRUE
#> 5 Zofia   5500 Finanse        5      FALSE
# Podstawowe informacje o ramce
nrow(pracownicy)    # liczba wierszy
#> [1] 5
ncol(pracownicy)    # liczba kolumn
#> [1] 5
dim(pracownicy)     # wymiary (wiersze × kolumny)
#> [1] 5 5
names(pracownicy)   # nazwy kolumn
#> [1] "imie"       "pensja"     "dzial"      "staz_lat"   "czy_menedz"
str(pracownicy)     # struktura — typy każdej kolumny
#> 'data.frame':    5 obs. of  5 variables:
#>  $ imie      : chr  "Anna" "Piotr" "Kasia" "Marek" ...
#>  $ pensja    : num  4500 5200 4800 6100 5500
#>  $ dzial     : chr  "IT" "Finanse" "IT" "HR" ...
#>  $ staz_lat  : num  3 7 2 10 5
#>  $ czy_menedz: logi  FALSE TRUE FALSE TRUE FALSE
import pandas as pd

# Tworzenie ramki danych ręcznie
pracownicy = pd.DataFrame({
    "imie":       ["Anna", "Piotr", "Kasia", "Marek", "Zofia"],
    "pensja":     [4500, 5200, 4800, 6100, 5500],
    "dzial":      ["IT", "Finanse", "IT", "HR", "Finanse"],
    "staz_lat":   [3, 7, 2, 10, 5],
    "czy_menedz": [False, True, False, True, False]
})

pracownicy
# Podstawowe informacje o ramce
len(pracownicy)            # liczba wierszy
len(pracownicy.columns)    # liczba kolumn
pracownicy.shape           # wymiary (wiersze, kolumny) jako krotka
pracownicy.columns         # nazwy kolumn
pracownicy.dtypes          # typy kolumn
pracownicy.info()          # szczegółowe informacje zbiorczo

3.2 Wczytywanie danych z pliku

W praktyce rzadko tworzymy dane ręcznie — najczęściej wczytujemy je z pliku CSV lub Excel.

library(readr)
library(readxl)

# Wczytanie pliku CSV (separator przecinek, domyślny)
dane <- read_csv("dane.csv")

# Wczytanie CSV z polskim formatem (separator średnik, przecinek dziesiętny)
dane <- read_csv2("dane_pl.csv")

# Wczytanie z Excela
dane <- read_excel("dane.xlsx", sheet = "Arkusz1")

# Pierwsze spojrzenie na dane
head(dane)        # pierwsze 6 wierszy
tail(dane)        # ostatnie 6 wierszy
glimpse(dane)     # kompaktowy przegląd struktury
summary(dane)     # statystyki opisowe
Tip

read_csv() (z pakietu readr) jest szybsze i nowocześniejsze niż bazowe read.csv(). Automatycznie rozpoznaje typy kolumn i obsługuje polskie znaki.

import pandas as pd

# Wczytanie pliku CSV (separator przecinek, domyślny)
dane = pd.read_csv("dane.csv")

# Wczytanie CSV z polskim formatem (separator średnik, przecinek dziesiętny)
dane = pd.read_csv("dane_pl.csv", sep=";", decimal=",")

# Wczytanie z Excela (wymaga pakietu openpyxl)
dane = pd.read_excel("dane.xlsx", sheet_name="Arkusz1")

# Pierwsze spojrzenie na dane
dane.head()       # pierwsze 5 wierszy
dane.tail()       # ostatnie 5 wierszy
dane.info()       # typy kolumn i liczba braków
dane.describe()   # statystyki opisowe zmiennych liczbowych

3.3 Wybieranie kolumn i wierszy

NoteAnalogia do Excela

Wybieranie danych to jak używanie filtrów i funkcji INDEKS/PODAJ.POZYCJĘ — tylko znacznie wygodniejsze i szybsze.

# --- Wybieranie kolumn ---

# Jedna kolumna (zwraca wektor)
pracownicy$pensja
#> [1] 4500 5200 4800 6100 5500
pracownicy[["pensja"]]
#> [1] 4500 5200 4800 6100 5500
# Wiele kolumn (zwraca ramkę danych)
select(pracownicy, imie, pensja)
#>    imie pensja
#> 1  Anna   4500
#> 2 Piotr   5200
#> 3 Kasia   4800
#> 4 Marek   6100
#> 5 Zofia   5500
select(pracownicy, -czy_menedz)    # wszystkie kolumny OPRÓCZ tej
#>    imie pensja   dzial staz_lat
#> 1  Anna   4500      IT        3
#> 2 Piotr   5200 Finanse        7
#> 3 Kasia   4800      IT        2
#> 4 Marek   6100      HR       10
#> 5 Zofia   5500 Finanse        5
# --- Wybieranie wierszy ---

# Konkretne wiersze po numerze
pracownicy[1, ]      # wiersz 1
#>   imie pensja dzial staz_lat czy_menedz
#> 1 Anna   4500    IT        3      FALSE
pracownicy[2:4, ]    # wiersze 2–4
#>    imie pensja   dzial staz_lat czy_menedz
#> 2 Piotr   5200 Finanse        7       TRUE
#> 3 Kasia   4800      IT        2      FALSE
#> 4 Marek   6100      HR       10       TRUE
# Filtrowanie po warunku
filter(pracownicy, dzial == "IT")
#>    imie pensja dzial staz_lat czy_menedz
#> 1  Anna   4500    IT        3      FALSE
#> 2 Kasia   4800    IT        2      FALSE
filter(pracownicy, pensja > 5000)
#>    imie pensja   dzial staz_lat czy_menedz
#> 1 Piotr   5200 Finanse        7       TRUE
#> 2 Marek   6100      HR       10       TRUE
#> 3 Zofia   5500 Finanse        5      FALSE
filter(pracownicy, dzial == "IT" & staz_lat > 2)   # oba warunki (AND)
#>   imie pensja dzial staz_lat czy_menedz
#> 1 Anna   4500    IT        3      FALSE
filter(pracownicy, dzial == "IT" | dzial == "HR")   # jeden z warunków (OR)
#>    imie pensja dzial staz_lat czy_menedz
#> 1  Anna   4500    IT        3      FALSE
#> 2 Kasia   4800    IT        2      FALSE
#> 3 Marek   6100    HR       10       TRUE
# --- Wiersze I kolumny jednocześnie (pipe operator) ---
pracownicy |>
  filter(pensja > 5000) |>
  select(imie, pensja)
#>    imie pensja
#> 1 Piotr   5200
#> 2 Marek   6100
#> 3 Zofia   5500
# --- Wybieranie kolumn ---

# Jedna kolumna (zwraca Series)
pracownicy["pensja"]

# Wiele kolumn (zwraca DataFrame)
pracownicy[["imie", "pensja"]]
pracownicy.drop(columns=["czy_menedz"])    # wszystkie OPRÓCZ tej
# --- Wybieranie wierszy ---

# Konkretne wiersze po pozycji (iloc — pamiętamy: od 0!)
pracownicy.iloc[0]         # wiersz 0 (pierwszy)
pracownicy.iloc[1:4]       # wiersze 1–3 (koniec wyłączony)

# Filtrowanie po warunku
pracownicy[pracownicy["dzial"] == "IT"]
pracownicy[pracownicy["pensja"] > 5000]
pracownicy[(pracownicy["dzial"] == "IT") & (pracownicy["staz_lat"] > 2)]   # AND
pracownicy[(pracownicy["dzial"] == "IT") | (pracownicy["dzial"] == "HR")]   # OR

# Metoda query() — czytelniejszy zapis
pracownicy.query('dzial == "IT" and staz_lat > 2')
# --- Wiersze I kolumny jednocześnie ---
pracownicy.loc[pracownicy["pensja"] > 5000, ["imie", "pensja"]]