Najpopularniejszym typem wykorzystywanym w R jest ramka danych. Przechowuje ona dane w postaci dwuwymiarowej tabeli. Ramka danych składa się z kolumn będących wektorami o dowolnym typie. Brak nazwy dla kolumny spowoduje, że będzie się ona nazywać tak jak zmienna przechowująca wektor lub jak całe wyrażenie tworzące tę kolumnę. Na szczęście nazwy kolumn mogą być zmienione przy użyciu funkcji names(). Przeanalizujmy przykłady:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
> imiona <- c("Jan", "Fiona", "Zofia") > wiek <- c(25, 23, 33) # tworzenie ramki danych, pierwsza kolumna przyjmuje nazwę 'imię', druga nazwę po zmiennej > ramka <- data.frame(imię = imiona, wiek) > ramka imię wiek 1 Jan 25 2 Fiona 23 3 Zofia 33 # wyświetlenie nazw kolumn ramki > names(ramka) [1] "imię" "wiek" # podmiana nazw kolumn > names(ramka) <- c("IMIĘ", "WIEK") > ramka IMIĘ WIEK 1 Jan 25 2 Fiona 23 3 Zofia 33 |
Warto zauważyć, że tworząc ramkę danych wektory będące kolumnami muszą mieć identyczną długość. Indeksowanie ramki danych przebiega analogicznie jak w przypadku wektora z tą różnicą, że teraz indeksujemy rzędy oraz kolumny. Możliwe jest również pobranie całej kolumny przy użyciu jej nazwy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# tworzymy ramkę > imiona <- c("Jan", "Fiona", "Zofia") > wiek <- c(25, 23, 33) > ramka <- data.frame(imiona, wiek, stringsAsFactors = FALSE) # pobieramy 1 i 2 wiersz > ramka[c(1, 2), ] imiona wiek 1 Jan 25 2 Fiona 23 # pierwsza kolumna bez drugiego wiersza > ramka[-2, 1] [1] "Jan" "Zofia" # bez drugiego wiersza > ramka[-2, ] imiona wiek 1 Jan 25 3 Zofia 33 # tylko druga kolumna > ramka[, 2] [1] 25 23 33 # pobieramy kolumnę 'wiek' po nazwie > ramka$wiek [1] 25 23 33 # inny sposób indeksowanie po nazwie > ramka[, "wiek"] [1] 25 23 33 |
Domyślnie przy tworzeniu ramki danych wektory zawierające łańcuch znaków są konwertowane do postaci cech grupujących, czyli faktorów. Aby temu zapobiec używamy opcji stringsAsFactors = FALSE w funkcji data.frame().
Ciekawszym sposobem indeksowania jest indeksowanie na podstawie zawartości ramki danych. Załóżmy, że chcemy pobrać rekordy osób poniżej 30 wieku życia. Innym przypadkiem byłoby pobranie danych tylko o Zofii. Wykorzystujemy tutaj poznane już operatory porównania. Mechanizm ten działa również dla wektora. W przykładzie wykorzystamy ramkę danych ‘ramka’ z poprzedniego przykładu:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# osoby poniżej 30 roku życia > ramka[ramka$wiek < 30, ] imiona wiek 1 Jan 25 2 Fiona 23 # dane tylko Zofii > ramka[ramka$imiona == "Zofia", ] imiona wiek 3 Zofia 33 # analogicznie dla wektorów > wiek <- ramka$wiek > wiek[wiek < 30] [1] 25 23 |
Ramki danych mogą się powiększać poprzez dodanie wiersza, bądź dodatkowej kolumny. W obu przypadkach rozmiary i typy (tylko dla wierszy) dodawanych danych muszę się zgadzać z rozmiarem i typami ramki danych. W przykładzie znów wykorzystamy ramkę danych ‘ramka’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# tworzymy nowy wiersz jako ramkę danych > nowy_wiersz <- data.frame(imiona = "Patryk", wiek = 25, stringsAsFactors = FALSE) # łączenie ramki danych z nowym wierszem > ramka <- rbind(ramka, nowy_wiersz) > ramka imiona wiek 1 Jan 25 2 Fiona 23 3 Zofia 33 4 Patryk 25 # dodanie nowej kolumny > płeć <- c("M", "K", "K", "M") > ramka <- cbind(ramka, płeć) > ramka imiona wiek płeć 1 Jan 25 M 2 Fiona 23 K 3 Zofia 33 K 4 Patryk 25 M # dodanie nowego wiersza przy użyciu indeksowania > ramka[5, 1] <- "Radek" > ramka[5, 2] <- 27 > ramka[5, 3] <- factor("M") > ramka imiona wiek płeć 1 Jan 25 M 2 Fiona 23 K 3 Zofia 33 K 4 Patryk 25 M 5 Radek 27 M |
Istnieje szereg funkcji przeznaczonych do wyświetlania informacji i badania właściwości ramki danych:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
> ramka imiona wiek płeć 1 Jan 25 M 2 Fiona 23 K 3 Zofia 33 K 4 Patryk 25 M 5 Radek 27 M # liczba kolumn w ramce > length(ramka) [1] 3 # rozmiary ramki: 5 wierszy, 3 kolumny > dim(ramka) [1] 5 3 # skrócony opis typów danych w ramce > str(ramka) 'data.frame': 5 obs. of 3 variables: $ imiona: chr "Jan" "Fiona" "Zofia" "Patryk" ... $ wiek : num 25 23 33 25 27 $ płeć : Factor w/ 2 levels "K","M": 2 1 1 2 2 # wyświetlenie pierwszych n wierszy (domyślnie n = 6) > head(ramka, n = 2) imiona wiek płeć 1 Jan 25 M 2 Fiona 23 K # wyświetlenie ostatnich n wierszy (domyślnie n = 6) > tail(ramka, n = 2) imiona wiek płeć 4 Patryk 25 M 5 Radek 27 M |