Ramka danych R: jak tworzyć, dołączać, wybierać i podzbiór

⚡ Inteligentne podsumowanie

R Data Frame przechowuje kolumny różnych typów o równej długości, co czyni ją standardową prostokątną strukturą do analizy. Nawiasy kwadratowe dzielą wiersze i kolumny, znak dolara dociera do kolumny, a funkcja subset() filtruje według warunku.

  • 🧱 Struktura: Ramka danych to lista wektorów o równej długości, więc każda kolumna może zawierać inny typ.
  • 🛠️. Kreacja: data.frame(a, b, c, d) łączy cztery wektory, a names() zmienia nazwy wszystkich kolejnych kolumn.
  • ✂️. Krajanie na plastry: df[A, B] czyta się jako wiersze, a następnie kolumny, a pusta strona zaznacza wszystko, co znajduje się po tej stronie.
  • Dołączanie: df$quantity przypisuje nową kolumnę, pod warunkiem, że nowy wektor dokładnie pasuje do liczby wierszy.
  • 🔎 Filtracja: subset(df, subset = price > 5) zachowuje tylko wiersze, w których warunek ma wartość PRAWDA.
  • ⚠️ Wersja Shift: Od wersji R 4.0.0 domyślną wartością stringsAsFactors jest FALSE, więc kolumny tekstowe pozostają znakowe.

R Data Frame Utwórz Dołącz Wybierz i podzbiór

Co to jest ramka danych?

A ramka danych to lista wektorów o równej długości. Macierz zawiera tylko jeden typ danych, podczas gdy ramka danych akceptuje różne typy danych (liczbowe, znakowe, czynnikowe itd.).

Definicja ta umieszcza ramkę danych pomiędzy dwoma sąsiadami, których będziesz stale spotykać w R.A. matryca jest prostokątny, ale jednoczęściowy i podstęp jest wielotypowy, ale nierówny. Ramka danych pożycza jedną właściwość od każdego z nich.

Structure Typy kolumn Długości elementów Typowe zastosowanie
wektor Tylko jeden typ Pojedyncza sekwencja Jedna zmienna
Matrix Tylko jeden typ Prostokątny Algebra numeryczna
Lista Dowolna mieszanka typów Może się różnić w zależności od elementu Dowolne kolekcje
Ramka danych Dowolna mieszanka typów Każda kolumna ma taką samą długość Analiza tabelaryczna

Ponieważ ramka danych jest w rzeczywistości listą znajdującą się pod spodem, akcesory używane na listach działają także tutaj, dlatego znak dolara pojawia się ponownie w dalszej części tego samouczka.

Jak utworzyć ramkę danych

Możemy utworzyć ramkę danych w R przekazując zmienne a, b, c i d do funkcji data.frame(). Możemy utworzyć ramkę danych i nadać kolumnom nazwy za pomocą names(), po prostu określając nazwę każdej zmiennej.

data.frame(df, stringsAsFactors = TRUE)

Argumenty:

  • df: Może to być macierz do przekształcenia w ramkę danych lub zbiór zmiennych do połączenia
  • ciągiAsFactors: Kontroluje, czy wektory znaków stają się kolumnami czynnikowymi. Domyślna wartość fabryczna wynosiła TRUE w starszych wersjach i FALSE od R 4.0.0, więc należy ją jawnie przekazać, gdy zachowanie ma znaczenie.

Możemy utworzyć ramkę danych w R dla naszego pierwszego zestawu danych, łącząc cztery zmienne o tej samej długości.

# Create a, b, c, d variables
a <- c(10,20,30,40)
b <- c('book', 'pen', 'textbook', 'pencil_case')
c <- c(TRUE,FALSE,TRUE,FALSE)
d <- c(2.5, 8, 10, 7)
# Join the variables to create a data frame
df <- data.frame(a,b,c,d)
df

Wyjście:

##     a         b     c     d
## 1  10        book  TRUE   2.5
## 2  20         pen  FALSE  8.0
## 3  30    textbook  TRUE   10.0
## 4  40 pencil_case  FALSE  7.0

Każdy wektor stał się kolumną, a cztery wartości w każdym wektorze stały się czterema wierszami. Należy zauważyć, że argumenty były nienazwane, więc R wyprowadził nagłówki kolumn z samych nazw zmiennych.

Widzimy, że nagłówki kolumn mają taką samą nazwę jak zmienne. Nazwę kolumny w R możemy zmienić za pomocą funkcji Names(). Sprawdź poniższy przykład tworzenia ramki danych w R:

# Name the data frame
names(df) <- c('ID', 'items', 'store', 'price')
df

Wyjście:

##   ID       items store price
## 1 10        book  TRUE   2.5
## 2 20         pen FALSE   8.0
## 3 30    textbook  TRUE  10.0
## 4 40 pencil_case FALSE   7.0

Przypisanie do names() powoduje zastąpienie wszystkich nagłówków naraz, więc wektor zastąpienia musi zawierać dokładnie jeden wpis na kolumnę. Aby zmienić nazwę pojedynczej kolumny, należy zaindeksować wektor names, np. names(df)[2] <- 'product'.

# Print the structure
str(df)

Wyjście:

## 'data.frame':    4 obs. of  4 variables:
##  $ ID   : num  10 20 30 40
##  $ items: Factor w/ 4 levels "book","pen","pencil_case",..: 1 2 4 3
##  $ store: logi  TRUE FALSE TRUE FALSE
##  $ price: num  2.5 8 10 7

Uwaga dotycząca wersji. Powyższy wynik został wygenerowany w wersji R starszej niż 4.0.0, w której funkcja data.frame() domyślnie konwertowała wektory znaków na czynniki, dlatego elementy są raportowane jako czynniki z czterema poziomami. W podstawowej dokumentacji R odnotowano, że ta domyślna wartość jest nowa w fabryce. zmieniono na stringsAsFactors = FALSE dla R 4.0.0Uruchomienie tego samego kodu w bieżącej wersji pozostawia elementy jako zwykłą kolumnę znakową, a funkcja str() zamiast tego drukuje chr. Dodaj stringsAsFactors = TRUE do wywołania data.frame(), aby odtworzyć wydruk, lub odczytaj samouczek dotyczący czynników na wypadek, gdyby czynniki były rzeczywiście potrzebne.

Wytnij ramkę danych

Po zbudowaniu ramki, kolejnym zadaniem jest wyciągnięcie jej fragmentów. Wycinanie to podstawowy sposób R, który wykorzystuje te same nawiasy kwadratowe co wektory, tylko z dwiema pozycjami zamiast jednej.

Możliwe jest wykonanie operacji SLICE w ramce danych. Wybieramy wiersze i kolumny do zwrócenia w nawiasach kwadratowych, poprzedzone nazwą ramki danych.

Ramka danych składa się z wierszy i kolumn, df[A, B]. A reprezentuje wiersze, a B kolumny. Możemy dokonać podziału, określając wiersze i/lub kolumny.

Na poniższym rysunku 1 lewa część przedstawia wydziwianie, a prawa część to kolumny. Należy pamiętać, że symbol : oznacza do. Na przykład 1:3 ma na celu wybranie wartości z 1 do 3.

Składnia podziału ramki danych R df[A, B] z wierszami po lewej stronie przecinka i kolumnami po prawej stronie

Na poniższym diagramie pokazujemy, jak uzyskać dostęp do różnych selekcji ramki danych:

Kolorowe strzałki nad ramką danych R pokazujące wybór pojedynczej komórki, zakresu wierszy, całej kolumny i bloku

  • Żółta strzałka wybiera rząd 1 w kolumna 2
  • Zielona strzałka wybiera wydziwianie 1 do 2
  • Czerwona strzałka wybiera kolumna 1
  • Niebieska strzałka wybiera wydziwianie 1 do 3 i kolumny 3 do 4

Zauważ, że jeśli pozostawimy lewą część pustą, R wybierze wszystkie rzędy. Analogicznie, jeśli pozostawimy prawą część pustą, R dokona wyboru wszystkie kolumny.

Kod możemy uruchomić w konsoli:

## Select row 1 in column 2
df[1,2]

Wyjście:

## [1] book
## Levels: book pen pencil_case textbook

Linia „Levels” pojawia się, ponieważ „Items” jest czynnikiem w tej sesji. W wersji R 4.0.0 i nowszych to samo wywołanie wyświetla pojedynczy ciąg „book” bez linii „Levels”.

## Select Rows 1 to 2
df[1:2,]

Wyjście:

##   ID items store price
## 1 10  book  TRUE   2.5
## 2 20   pen FALSE   8.0
## Select Columns 1
df[,1]

Wyjście:

## [1] 10 20 30 40

Wybranie pojedynczej kolumny za pomocą df[,1] powoduje usunięcie ramki i zwrócenie zwykłego wektora. Dodaj drop = FALSE, jak w df[, 1, drop = FALSE], gdy zamiast tego potrzebna jest jednokolumnowa ramka danych.

## Select Rows 1 to 3 and columns 3 to 4
df[1:3, 3:4]

Wyjście:

##   store price
## 1  TRUE   2.5
## 2 FALSE   8.0
## 3  TRUE  10.0

Można również wybrać kolumny wraz z ich nazwami. Na przykład poniższy kod:tracma dwie kolumny: ID i sklep.

# Slice with columns name
df[, c('ID', 'store')]

Wyjście:

##   ID store
## 1 10  TRUE
## 2 20 FALSE
## 3 30  TRUE
## 4 40 FALSE

Nazwy są bezpieczniejsze niż pozycje w kodzie produkcyjnym, ponieważ wstawianie lub zmiana kolejności kolumn bezgłośnie zmienia to, do czego odwołuje się df[, 3], podczas gdy df[, 'store'] cały czas wskazuje na te same dane.

Dołącz kolumnę do ramki danych

Możesz również dodać kolumnę do ramki danych. Musisz użyć symbolu $, aby nazwać nową zmienną i dodać kolumnę do ramki danych w R.

# Create a new vector
quantity <- c(10, 35, 40, 5)

# Add `quantity` to the `df` data frame
df$quantity <- quantity
df

Wyjście:

##   ID       items store price quantity
## 1 10        book  TRUE   2.5       10
## 2 20         pen FALSE   8.0       35
## 3 30    textbook  TRUE  10.0       40
## 4 40 pencil_case FALSE   7.0        5

Uwaga: Liczba elementów w wektorze musi być równa liczbie elementów w ramce danych. Wykonanie poniższego polecenia w celu dodania kolumny do ramki danych w R

quantity <- c(10, 35, 40)
# Add `quantity` to the `df` data frame
df$quantity <- quantity

Daje błąd:

Error in `

lt;-.data.frame`(`*tmp*`, quantity, value = c(10, 35, 40))
replacement has 3 rows, data has 4

Komunikat podaje nazwę operatora zastępowania dla ramek danych i określa obie wartości, więc dokładnie wskazuje, co należy poprawić. R przetwarza zamiennik tylko wtedy, gdy jego długość dzieli liczbę wierszy równo, dlatego wartość o długości 1, taka jak df$currency <- 'EUR', jest akceptowana, a wektor o długości 3, obejmujący cztery wiersze, jest odrzucany. Funkcja cbind() dodaje kolumnę w ten sam sposób, a rbind() jest jej odpowiednikiem w dodawaniu wierszy.

Wybierz kolumnę ramki danych

Czasami musimy zapisać kolumnę ramki danych do wykorzystania w przyszłości lub wykonać operację na kolumnie. Możemy użyć znaku $, aby wybrać kolumnę z ramki danych.

# Select the column ID
df$ID

Wyjście:

## [1] 1 2 3 4

Przeczytaj uważnie ten wynik. Identyfikator został zbudowany z wektora c(10, 20, 30, 40), więc konsola na żywo wyświetla tutaj 10 20 30 40; liczby 1 2 3 4 pokazane powyżej to pozycje wierszy, a nie wartości zapisane. Znak [1] na początku wiersza to po prostu indeks pierwszego elementu w tym wierszu, a nie część danych.

Trzy trasy docierają do tej samej kolumny: df$ID, df[['ID']] i df[, 'ID']. Znak dolara wykonuje częściowe dopasowanie, więc df$I nadal znalazłoby ID, co jest wygodne na konsoli, ale ryzykowne w zapisanym skrypcie.

Podzbiór ramki danych

W poprzedniej sekcji wybraliśmy całą kolumnę bez warunku. Jest to możliwe podzbiór na podstawie tego, czy dany warunek był spełniony, czy też nie.

Używamy funkcji subset().

subset(x, condition)
arguments:
- x: data frame used to perform the subset
- condition: define the conditional statement

Chcemy zwrócić tylko te przedmioty, których cena jest wyższa niż 5, dlatego możemy zrobić:

# Select price above 5
subset(df, subset = price > 5)

Wyjście:

ID       items store price
2 20         pen FALSE     8
3 30    textbook  TRUE    10
4 40 pencil_case FALSE     7

Etykiety wierszy 2, 3 i 4 to oryginalne nazwy wierszy przeniesione z df, co pozwala stwierdzić, że pierwszy wiersz został odfiltrowany. Funkcja subset() akceptuje również argument SELECT do jednoczesnego wyboru kolumn, a równoważna forma nawiasowa to df[df$price > 5, ]. Forma nawiasowa zachowuje wiersze NA, w których brakuje warunku, podczas gdy subset() je pomija, więc te dwie formy nie zawsze są zamienne.

FAQ

Użyj rbind(df, new_row), gdzie new_row to ramka danych lub lista z tymi samymi kolumnami w tej samej kolejności. Typy kolumn muszą być zgodne, w przeciwnym razie R je wymusi. W przypadku wielu wierszy najpierw utwórz listę i połącz ją raz, ponieważ wielokrotne wywołania rbind() są powolne.

Przypisz mu wartość NULL, jak w df$quantity <- NULL. Indeksowanie ujemne również działa: df[, -3] usuwa trzecią kolumnę, a df[, !names(df) %in% c("store")] usuwa kolumny według nazwy, niezależnie od ich pozycji.

dim(df) zwraca wiersze i kolumny razem, podczas gdy nrow() i ncol() zwracają je osobno. str(df) drukuje typ każdej kolumny, summary(df) zwraca statystyki dla każdej kolumny, a head(df) wyświetla pierwsze sześć wierszy.

Indeksuj wektor nazw: names(df)[2] <- "product" zmienia tylko drugi nagłówek. Aby zmienić nazwę na bieżącą, użyj names(df)[names(df) == "items"] <- "product", co działa nawet po zmianie kolejności kolumn.

Tibble to ramka danych Tidyverse. Nigdy nie konwertuje ciągów znaków na czynniki, nigdy nie dopasowuje częściowo nazw kolumn, wyświetla tylko pierwsze dziesięć wierszy z typami kolumn i zawsze zwraca tibble po podzbiorze z pojedynczym nawiasem.

filtr(df, cena > 5) jest dplyr jest równoważna i łączy się z select(), mutate() i arrange() poprzez potok. W przeciwieństwie do subset(), filter() jest zaprojektowana do użytku programowego, więc zachowuje się przewidywalnie wewnątrz funkcji.

Asystenci AI odczytują dane wyjściowe funkcji str() i summary(), a następnie proponują konwersje typów, strategie obsługi wartości brakujących i zmiany nazw kolumn w postaci kodu możliwego do wykonania. Wyjaśniają również zagadkowe błędy zamiany, choć każda wygenerowana transformacja nadal wymaga weryfikacji z rzeczywistymi danymi.

Tak. Drugi pilot GitHub wbiega RStudio 2023.09.0 i nowsze poprzez Narzędzia, Opcje globalne, a następnie ustawienia asystenta kodu. Tworzy on wywołania data.frame(), subset() i rbind() z komentarza, ale nazwy kolumn muszą zostać zweryfikowane.

Podsumuj ten post następująco: