R Data Frame: Cum se creează, se adaugă, se selectează și se subsetează

⚡ Rezumat inteligent

Frame-ul de date R stochează coloane de diferite tipuri la lungimi egale, ceea ce îl face structura dreptunghiulară standard pentru analiză. Parantezele pătrate secționează rândurile și coloanele, semnul dolar ajunge la o coloană, iar subset() filtrează după condiție.

  • 🧱 Structura: Un cadru de date este o listă de vectori de lungime egală, astfel încât fiecare coloană poate conține un tip diferit.
  • 🛠️ Creare: data.frame(a, b, c, d) unește patru vectori, iar names() redenumește fiecare coloană ulterior.
  • ✂️ Tăiere: df[A, B] citește ca rânduri apoi coloane, iar o parte goală selectează tot ce se află pe acea parte.
  • Adăugare: df$quantity atribuie o nouă coloană, cu condiția ca noul vector să corespundă exact cu numărul de rânduri.
  • 🔎 Filtrare: subset(df, subset = price > 5) păstrează doar rândurile în care condiția se evaluează ca TRUE.
  • ⚠️ Versiune Shift: Începând cu R 4.0.0, valoarea implicită a parametrului stringsAsFactors este FALSE, deci coloanele de text rămân formate din caractere.

Creare cadru de date R Adăugare Selectare și Subset

Ce este un cadru de date?

A cadru de date este o listă de vectori de lungime egală. O matrice conține un singur tip de date, în timp ce un cadru de date acceptă diferite tipuri de date (numerice, de caractere, factoriale etc.).

Această definiție plasează cadrul de date între doi vecini pe care îi veți întâlni constant în R. A matrice este dreptunghiulară, dar cu un singur tip și a listă este multi-tipizat, dar neuniform. Cadrul de date împrumută câte o proprietate de la fiecare.

Structure Tipuri de coloane Lungimile elementelor Utilizare tipică
Vector Un singur tip Secvență unică O variabilă
Matrice Un singur tip Dreptunghiular Algebră numerică
Listă Orice amestec de tipuri Poate diferi în funcție de element Colecții arbitrare
Cadrul de date Orice amestec de tipuri Fiecare coloană de lungime egală Analiză tabelară

Deoarece un cadru de date este de fapt o listă dedesubt, accesorii utilizați în liste funcționează și aici, motiv pentru care semnul dolar apare din nou mai târziu în acest tutorial.

Cum se creează un cadru de date

Putem crea un cadru de date în R prin transmiterea variabilelor a, b, c și d în funcția data.frame(). Putem crea cadrul de date și denumi coloanele cu names(), specificând pur și simplu numele fiecărei variabile.

data.frame(df, stringsAsFactors = TRUE)

Argumente:

  • df: Poate fi o matrice de convertit ca un cadru de date sau o colecție de variabile de alăturat
  • stringsAsFactorsControlează dacă vectorii de caractere devin coloane de factori. Valoarea implicită din fabrică era TRUE în versiunile mai vechi și a fost FALSE începând cu R 4.0.0, așadar transmiteți-o explicit atunci când comportamentul contează.

Putem crea un cadru de date în R pentru primul nostru set de date combinând patru variabile de aceeași lungime.

# 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

ieșire:

##     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

Fiecare vector a devenit o coloană, iar cele patru valori din fiecare vector au devenit cele patru rânduri. Rețineți că argumentele nu aveau nume, așa că R a derivat anteturile coloanelor din numele variabilelor în sine.

Putem vedea că anteturile coloanei au același nume ca și variabilele. Putem schimba numele coloanei în R cu funcția names(). Verificați exemplul R create dataframe de mai jos:

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

ieșire:

##   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

Atribuirea funcției `names()` înlocuiește fiecare antet simultan, deci vectorul de înlocuire trebuie să aibă exact o intrare pe coloană. Pentru a redenumi o singură coloană, indexați vectorul `names`, ca în `names(df)[2] <- 'product'`.

# Print the structure
str(df)

ieșire:

## '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

Notă privind versiunea. Rezultatul de mai sus a fost produs pe o versiune R mai veche decât 4.0.0, unde data.frame() convertia vectorii de caractere în factori în mod implicit, motiv pentru care items sunt raportați ca Factor cu patru niveluri. Documentația R de bază consemnează că această versiune implicită, nouă din fabrică schimbat în stringsAsFactors = FALSE pentru R 4.0.0Rularea aceluiași cod pe o versiune curentă lasă elementele ca o coloană de caractere simple, iar str() afișează în schimb chr. Adăugați stringsAsFactors = TRUE la apelul data.frame() pentru a reproduce ieșirea afișată sau pentru a citi tutorialul factorilor pentru momentul în care factorii sunt într-adevăr necesari.

Secționează cadru de date

Odată ce cadrul este construit, următoarea sarcină este extragerea unor părți din acesta. Secționarea este metoda de bază în R pentru a face acest lucru și folosește aceleași paranteze pătrate ca și vectorii, doar cu două poziții în loc de una.

Este posibilă felierea valorilor unui cadru de date. Selectăm rândurile și coloanele care vor fi returnate între paranteze precedate de numele cadrului de date.

Un cadru de date este compus din rânduri și coloane, df[A, B]. A reprezintă rândurile și B coloanele. Putem tăia fie prin specificarea rândurilor și/sau coloanelor.

Din imaginea 1 de mai jos, partea din stânga reprezintă rânduri, iar partea dreaptă este coloane. Rețineți că simbolul : înseamnă la. De exemplu, 1:3 intenționează să selecteze valori din 1 la 3.

Sintaxa de secționare a cadrului de date R df[A, B] cu rânduri în stânga virgulei și coloane în dreapta

În diagrama de mai jos arătăm cum se accesează diferitele selecții ale cadrului de date:

Săgeți colorate peste un cadru de date R care arată selecțiile pentru o singură celulă, un interval de rânduri, o coloană întreagă și un bloc

  • Săgeata galbenă selectează rând 1 în coloană 2
  • Săgeata verde selectează rânduri 1 la 2
  • Săgeata roșie selectează coloană 1
  • Săgeata albastră selectează rânduri 1 până în 3 și coloane 3 la 4

Rețineți că, dacă lăsăm partea stângă goală, R va selecta toate rândurile. Prin analogie, dacă lăsăm partea dreaptă goală, R va selecta toate coloanele.

Putem rula codul în consolă:

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

ieșire:

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

Linia Niveluri apare deoarece elementele reprezintă un factor în această sesiune. În R 4.0.0 și versiunile ulterioare, același apel afișează șirul unic „book” fără nicio linie Niveluri.

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

ieșire:

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

ieșire:

## [1] 10 20 30 40

Selectarea unei singure coloane cu df[,1] elimină wrapper-ul cadrului și returnează un vector simplu. Adăugați drop = FALSE, ca în df[, 1, drop = FALSE], atunci când este nevoie de un cadru de date pe o singură coloană.

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

ieșire:

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

De asemenea, este posibil să selectați coloanele cu numele lor. De exemplu, codul de mai jos extracAre două coloane: ID și magazin.

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

ieșire:

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

Numele sunt mai sigure decât pozițiile în codul de producție, deoarece inserarea sau reordonarea unei coloane modifică silențios la ce se referă df[, 3] în timp ce df[, 'store'] indică în mod constant aceleași date.

Adăugați o coloană la cadrul de date

De asemenea, puteți adăuga o coloană la un Data Frame. Trebuie să utilizați simbolul $ pentru a denumi noua variabilă și a adăuga o coloană la un dataframe în R.

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

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

ieșire:

##   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

Notă: Numărul de elemente din vector trebuie să fie egal cu numărul de elemente din cadrul de date. Executați următoarea instrucțiune pentru a adăuga o coloană la cadrul de date în R

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

Dă eroare:

Error in `

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

Mesajul denumește operatorul de înlocuire pentru cadrele de date și indică ambele numărătoare, deci vă spune exact ce trebuie corectat. R reciclează o înlocuire doar atunci când lungimea sa împarte în mod egal numărul de rânduri, motiv pentru care o valoare de lungime 1, cum ar fi df$currency <- 'EUR', este acceptată, în timp ce un vector de lungime 3 pentru patru rânduri este refuzat. cbind() adaugă o coloană în același mod, iar rbind() este omologul său pentru adăugarea de rânduri.

Selectați o coloană a unui cadru de date

Uneori, trebuie să stocăm o coloană dintr-un cadru de date pentru utilizare ulterioară sau să efectuăm o operație asupra unei coloane. Putem folosi semnul $ pentru a selecta coloana dintr-un cadru de date.

# Select the column ID
df$ID

ieșire:

## [1] 1 2 3 4

Citiți cu atenție rezultatul. ID-ul a fost construit din vectorul c(10, 20, 30, 40), deci o consolă live afișează aici 10 20 30 40; valorile 1 2 3 4 de mai sus sunt pozițiile pe rând, nu valorile stocate. [1] de la începutul liniei este pur și simplu indexul primului element de pe acea linie, nu face parte din date.

Trei rute ajung la aceeași coloană: df$ID, df[['ID']] și df[, 'ID']. Semnul dolar efectuează o potrivire parțială, deci df$I ar găsi în continuare ID-ul, ceea ce este convenabil în consolă și riscant într-un script salvat.

Subset un cadru de date

În secțiunea anterioară, am selectat o întreagă coloană fără condiție. Este posibil să submult pe baza faptului că o anumită condiție era sau nu adevărată.

Folosim funcția subset().

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

Dorim să returnăm doar articolele cu un preț mai mare de 5, așa că putem face:

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

ieșire:

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

Etichetele rândurilor 2, 3 și 4 sunt numele originale ale rândurilor preluate de la df, așa se poate spune că primul rând a fost filtrat. subset() acceptă, de asemenea, un argument select pentru alegerea simultană a coloanelor, iar forma echivalentă de paranteze este df[df$price > 5, ]. Forma de paranteze păstrează NA rânduri unde condiția lipsește, în timp ce subset() le elimină, deci cele două nu sunt întotdeauna interschimbabile.

Întrebări frecvente

Folosește rbind(df, new_row), unde new_row este un cadru de date sau o listă cu aceleași coloane în aceeași ordine. Tipurile de coloane trebuie să se potrivească, altfel R le forțează. Pentru mai multe rânduri, construiește mai întâi o listă și combină-le o singură dată, deoarece apelurile repetate ale funcției rbind() sunt lente.

Atribuiți-i valoarea NULL, ca în df$quantity <- NULL. Indexarea negativă funcționează și ea: df[, -3] elimină a treia coloană, iar df[, !names(df) %in% c("store")] elimină coloanele după nume, fără a depinde de poziția lor.

dim(df) returnează rânduri și coloane împreună, în timp ce nrow() și ncol() returnează fiecare separat. str(df) afișează tipul fiecărei coloane, summary(df) oferă statistici pe coloană, iar head(df) afișează primele șase rânduri.

Indexează vectorul de nume: names(df)[2] <- "product" modifică doar al doilea antet. Pentru a redenumi după numele curent, folosește names(df)[names(df) == "items"] <- "product", care continuă să funcționeze chiar și după schimbarea ordinii coloanelor.

Un tibble este cadrul de date tidyverse. Nu convertește niciodată șiruri de caractere în factori, nu potrivește niciodată parțial numele coloanelor, afișează doar primele zece rânduri cu tipurile de coloană și returnează întotdeauna un tibble atunci când este subset cu o singură paranteză.

filtru(df, preț > 5) este dplyr echivalent și se înlănțuie cu select(), mutate() și arrange() prin pipe. Spre deosebire de subset(), filter() este conceput pentru utilizare programatică, deci se comportă previzibil în interiorul funcțiilor.

Asistenții inteligenți artificiali citesc ieșirea funcțiilor str() și summary(), apoi propun conversii de tipuri, strategii pentru valori lipsă și redenumiri de coloane sub formă de cod rulabil. De asemenea, explică erorile criptice de înlocuire, deși fiecare transformare generată trebuie în continuare verificată în raport cu datele reale.

Da. Copilotul GitHub aleargă în RStudio 2023.09.0 și versiunile ulterioare prin Instrumente, Opțiuni globale, apoi setările asistentului de cod. Acesta elimină apelurile data.frame(), subset() și rbind() dintr-un comentariu, dar numele coloanelor trebuie verificate.

Rezumați această postare cu: