Ramka danych to lista kolumn
Ramka danych (data frame) to tabela w R: wiersze to obserwacje, kolumny to zmienne. To arkusz kalkulacyjny R i kształt, w jakim przychodzą praktycznie wszystkie prawdziwe dane: jeden wiersz na osobę, pomiar czy transakcję; jedna kolumna na cechę.
Pod względem struktury ramka danych to lista wektorów równej długości z nałożonym zachowaniem wierszy i kolumn. Ten jeden fakt wyjaśnia większość jej zasad: każda kolumna ma jeden typ (bo jest wektorem), różne kolumny mogą mieć różne typy (bo to lista), a wszystkie kolumny muszą mieć tę samą długość (to właśnie część "ramka").
Tworzysz ją, przekazując nazwane wektory do data.frame():
Tekst, liczby i wartości logiczne obok siebie, czyli mieszanka, której macierz nie pomieści. W praktyce rzadko wpisuje się dane ręcznie w ten sposób; tabele zwykle przychodzą przez read.csv albo z bazy danych. Wszystko poniżej działa jednak identycznie, niezależnie od tego, skąd pochodzi ramka danych.
Pierwszy rzut oka na ramkę danych
Nigdy nie licz na zbiorze danych, którego nie obejrzysz. Narzędzia R do podglądu są krótkie i warto używać ich odruchowo:
str()uruchamiaj jako pierwsze na każdych świeżo wczytanych danych: jeden wiersz na kolumnę z jej typem i pierwszymi wartościami. To tutaj wyłapiesz kolumnę "liczb", która przez jeden zabłąkany wpis wczytała się jako tekst.nrow()/ncol()podają wymiary;names()wypisuje nazwy kolumn.summary()daje statystyki dla każdej kolumny: min/medianę/średnią/max dla liczb, liczebności dla wartości logicznych i czynników.head(df)itail(df)wypisują pierwsze i ostatnie sześć wierszy, co jest niezbędne, gdy prawdziwe zbiory danych robią się za duże, żeby wypisać je w całości.head()zobaczysz w działaniu poniżej na wbudowanym zbiorze danych.
Trzy sposoby na pobranie kolumny
Dostęp do kolumn to podstawowa operacja, a R daje trzy zapisy:
people$age: forma codzienna, krótka, czytelna i podpowiadana w większości edytorów.people[["age"]]: identyczny wynik, ale nazwa może pochodzić ze zmiennej (col <- "age"; people[[col]]), czego$nie potrafi. Wybieraj ją wewnątrz funkcji.people[, "age"]: styl macierzowy, wiersze przed przecinkiem (puste = wszystkie), kolumny po nim.
Wszystkie trzy zwracają kolumnę jako zwykły wektor, gotowy do mean(people$age). Czwarty zapis we fragmencie to pułapka: people["age"] z pojedynczymi nawiasami zwraca jednokolumnową ramkę danych, a nie wektor. To ta sama różnica między [ a [[ co w listach, bo ramka danych jest listą. Jeśli funkcja matematyczna narzeka, że dane wejściowe nie są liczbowe, sprawdź nawiasy.
Wiersze i komórki
Zapis [row, column] sięga do dowolnego wycinka tabeli:
people[2, ] to cały drugi wiersz (jako jednowierszowa ramka danych; wiersze zachowują ramkę, bo mieszają typy). people[2, "name"] to pojedyncza komórka. Wektor numerów wierszy pobiera kilka wierszy.
Najważniejsza jest ostatnia linia: warunek logiczny na kolumnie wybiera wiersze, tutaj wszystkie osoby powyżej 28 lat. Ten wzorzec maskowania wierszy to podstawa każdego filtrowania danych w R i zasługuje na osobny artykuł: pełne omówienie, łącznie z subset() i filtrami z wieloma warunkami, znajdziesz w filtrowaniu i wybieraniu podzbiorów.
Dodawanie i usuwanie kolumn
Ponieważ ramka danych to lista kolumn, kolumny dodaje się i usuwa zwykłym przypisaniem:
Przypisanie do nowej nazwy dodaje kolumnę; wektor musi pasować do nrow() (albo mieć długość 1, wtedy jest powielany do każdego wiersza). Drugie dodanie pokazuje typowy ruch: nowe kolumny obliczane z istniejących przez wektorowe operacje na całej kolumnie naraz. Przypisanie NULL całkowicie usuwa kolumnę.
W ten sam sposób nadpiszesz wartości kolumny: people$age <- people$age + 1 postarza wszystkich o rok.
Wbudowane zbiory danych i słowo o tibble
R ma wczytane zbiory danych do ćwiczeń, więc wszystko powyżej wypróbujesz bez importowania czegokolwiek. Dwa, które spotkasz w każdym tutorialu, to mtcars (32 samochody, 11 zmiennych liczbowych) i iris (150 kwiatów, 4 pomiary i czynnik z gatunkiem):
Tutaj head() pokazuje swoją wartość: sześć wierszy mówi, jak wyglądają dane, bez zalewania ekranu. Te zbiory to idealne miejsca do eksperymentów: gdy nie wiesz, jak zachowuje się jakaś funkcja, sprawdź ją na mtcars, zanim użyjesz jej na własnych danych.
Jeden termin, który spotkasz, gdy tylko dotkniesz tidyverse: tibble, czyli wersja ramki danych z tidyverse. Ta sama idea, grzeczniejsze zachowanie: wypisywanie pokazuje tylko pierwsze dziesięć wierszy z typami kolumn i nie ma częściowego dopasowywania nazw. Tworzy się ją przez tibble() albo dostaje z funkcji readr/dplyr:
library(tibble)
tibble(name = c("Rosa", "Ken"), age = c(30, 41))
#> # A tibble: 2 x 2
#> name age
#> <chr> <dbl>
#> 1 Rosa 30
#> 2 Ken 41
Wszystko w tym artykule ($, str(), dodawanie kolumn, logiczne maski wierszy) działa na tibble bez zmian. Tibble jest ramką danych z dodatkowym szlifem; kto zna ramki danych, zna oba.
Co warto zapamiętać
- Ramka danych to lista kolumn równej długości: jeden typ na kolumnę, różne typy w całej tabeli. To arkusz kalkulacyjny R.
- Najpierw obejrzyj, potem licz: najpierw
str(), potemhead(),summary(),nrow()/ncol()/names(). df$col,df[["col"]]idf[, "col"]zwracają kolumnę jako wektor; pojedyncze nawiasydf["col"]zwracają ramkę danych.df[rows, cols]wycina wszystko; logiczna maska przed przecinkiem filtruje wiersze.- Kolumny dodajesz przypisaniem (często obliczając je z innych kolumn), usuwasz przez
NULL; ćwicz namtcars.
Dalej: brakujące wartości, czyli co znaczy NA, dlaczego rozprzestrzenia się w obliczeniach i jak sobie z nim radzić.
Najczęściej zadawane pytania
Jak utworzyć ramkę danych w R?
Przekaż nazwane wektory równej długości do data.frame(): df <- data.frame(name = c("Rosa", "Ken"), age = c(30, 41)). Każdy wektor staje się kolumną. W praktyce większości ramek danych nie wpisuje się ręcznie, tylko przychodzą z read.csv() albo z bazy danych, ale struktura jest ta sama.
Jak odwołać się do kolumny ramki danych w R?
Na trzy sposoby: df$age (szybko i czytelnie), df[["age"]] (ten sam wynik, działa, gdy nazwa kolumny jest zapisana w zmiennej) i df[, "age"] (styl macierzowy). Wszystkie trzy zwracają kolumnę jako zwykły wektor. df["age"] z pojedynczymi nawiasami zwraca natomiast jednokolumnową ramkę danych, co często wprowadza w błąd.
Co pokazuje str() dla ramki danych?
Jeden wiersz na kolumnę: nazwę, typ i kilka pierwszych wartości, a na górze liczbę wierszy i kolumn. To najszybszy sposób, żeby sprawdzić, czy kolumna wczytała się jako liczby, czy jako tekst, dlatego str() powinno być pierwszą rzeczą uruchamianą na każdym świeżo wczytanym zbiorze danych.
Jak dodać kolumnę do ramki danych w R?
Przypisz wartość do nazwy, która jeszcze nie istnieje: df$score <- c(88, 75, 93). Wektor musi mieć tyle elementów, ile jest wierszy (albo długość 1, wtedy jest powielany do każdego wiersza). Kolumnę usuniesz, przypisując NULL: df$score <- NULL.