R Data Frame: creëren, toevoegen, selecteren en subsetten

⚡ Slimme samenvatting

Een R-dataframe slaat kolommen van verschillende gegevenstypen op met gelijke lengte, waardoor het de standaard rechthoekige structuur voor analyse vormt. Vierkante haken splitsen rijen en kolommen, het dollarteken ($) geeft een kolom aan en de functie `subset()` filtert op basis van een voorwaarde.

  • 🧱 Structuur: Een dataframe is een lijst van vectoren van gelijke lengte, waardoor elke kolom een ​​ander gegevenstype kan bevatten.
  • Creation: data.frame(a, b, c, d) voegt vier vectoren samen, en names() hernoemt vervolgens elke kolom.
  • ✂️ Snijden: df[A, B] wordt gelezen als rijen en vervolgens kolommen, en een lege zijde selecteert alles aan die zijde.
  • Toevoegen: df$quantity kent een nieuwe kolom toe, mits de nieuwe vector exact overeenkomt met het aantal rijen.
  • 🔎 filtering: subset(df, subset = price > 5) behoudt alleen de rijen waar de voorwaarde waar is.
  • ⚠️ Versie Shift: Sinds R 4.0.0 is de standaardwaarde van stringsAsFactors FALSE, waardoor tekstkolommen tekens blijven.

R-dataframe maken, toevoegen, selecteren en subsets maken

Wat is een dataframe?

A dataframe Een dataframe is een lijst van vectoren met gelijke lengte. Een matrix bevat slechts één type data, terwijl een dataframe verschillende datatypen accepteert (numeriek, tekenreeks, factor, enz.).

Die definitie plaatst het dataframe tussen twee buren die je constant in R zult tegenkomen. Matrix is rechthoekig maar enkelvoudig getypt, en een lijst Het is van meerdere typen, maar onregelmatig. Het dataframe leent één eigenschap van elk type.

Structuur Kolomtypen Elementlengtes Typisch gebruik
vector Slechts één type Enkele sequentie Eén variabele
Matrix Slechts één type rechthoekig Numerieke algebra
Lijst Elke combinatie van soorten Kan per element verschillen Willekeurige verzamelingen
Data frame Elke combinatie van soorten Elke kolom heeft dezelfde lengte. Tabelanalyse

Omdat een dataframe in feite een lijst is, werken de methoden die voor lijsten worden gebruikt hier ook. Daarom verschijnt het dollarteken later in deze handleiding opnieuw.

Hoe u een dataframe maakt

We kunnen er een dataframe in maken R Door de variabelen a, b, c en d door te geven aan de functie data.frame(), kunnen we het dataframe creëren en de kolommen benoemen met names(), waarbij we simpelweg de naam van elke variabele specificeren.

data.frame(df, stringsAsFactors = TRUE)

argumenten:

  • df: Het kan een matrix zijn die moet worden omgezet als een dataframe of een verzameling variabelen die moet worden samengevoegd
  • stringsAsFactors: Bepaalt of tekenreeksvectoren factorkolommen worden. De standaardwaarde was TRUE in oudere versies en is FALSE sinds R 4.0.0, dus geef deze expliciet door wanneer dit gedrag van belang is.

We kunnen een dataframe in R maken voor onze eerste dataset door vier variabelen van dezelfde lengte te combineren.

# 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

Output:

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

Elke vector werd een kolom en de vier waarden in elke vector werden de vier rijen. Merk op dat de argumenten geen namen hadden, dus R leidde de kolomkoppen af ​​van de variabelnamen zelf.

We kunnen zien dat de kolomkoppen dezelfde naam hebben als de variabelen. We kunnen de kolomnaam in R wijzigen met de functie namen(). Bekijk het R create dataframe-voorbeeld hieronder:

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

Output:

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

Door een waarde toe te wijzen aan names() worden alle kopteksten in één keer vervangen, dus de vervangingsvector moet precies één item per kolom bevatten. Om in plaats daarvan een enkele kolom te hernoemen, indexeer je de names-vector, zoals in names(df)[2] <- 'product'.

# Print the structure
str(df)

Output:

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

Versie-opmerking. De bovenstaande uitvoer is gegenereerd met een R-versie ouder dan 4.0.0, waarin `data.frame()` standaard tekenreeksvectoren naar factoren converteerde. Daarom wordt `items` weergegeven als een factor met vier niveaus. De basisdocumentatie van R vermeldt dat deze standaardinstelling van de fabrieksversie dit deed. gewijzigd naar stringsAsFactors = FALSE voor R 4.0.0Als je dezelfde code uitvoert op een recente versie, worden de items als een kolom met gewone tekens weergegeven en print str() in plaats daarvan chr. Voeg stringsAsFactors = TRUE toe aan de data.frame()-aanroep om de afgedrukte uitvoer te reproduceren, of lees de factorhandleiding voor situaties waarin factoren daadwerkelijk gewenst zijn.

Segmentgegevensframe

Nadat het frame is opgebouwd, is de volgende stap het terugtrekken van onderdelen ervan. Slicing is de standaard R-manier om dat te doen, en het gebruikt dezelfde vierkante haken als vectoren, alleen met twee posities in plaats van één.

Het is mogelijk om waarden uit een DataFrame te selecteren (slicen). We selecteren de rijen en kolommen die we willen retourneren tussen haakjes, voorafgegaan door de naam van het dataframe.

Een dataframe is samengesteld uit rijen en kolommen, df[A, B]. A vertegenwoordigt de rijen en B de kolommen. We kunnen segmenteren door de rijen en/of kolommen op te geven.

In afbeelding 1 hieronder vertegenwoordigt het linkergedeelte de rijen, en het rechterdeel is de kolommen. Merk op dat het symbool: betekent naar. 1:3 is bijvoorbeeld bedoeld om waarden uit 1 te selecteren naar 3.

Syntaxis voor het selecteren van een dataframe in R: df[A, B], waarbij de rijen links van de komma en de kolommen rechts staan.

In het onderstaande diagram laten we zien hoe je toegang krijgt tot verschillende selecties in het dataframe:

Gekleurde pijlen boven een R-dataframe tonen selecties van afzonderlijke cellen, rijbereiken, hele kolommen en blokken.

  • De gele pijl selecteert de rij 1 in kolom 2
  • De groene pijl selecteert de rijen 1 tot 2
  • De rode pijl selecteert de kolom 1
  • De blauwe pijl selecteert de rijen 1 tot 3 en kolommen 3 tot 4

Merk op dat, als we het linkerdeel leeg laten, R zal selecteren alle rijen. Naar analogie: als we het rechterdeel blanco laten, zal R selecteren alle kolommen.

We kunnen de code in de console uitvoeren:

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

Output:

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

De regel 'Levels' verschijnt omdat 'items' een factor is in deze sessie. In R 4.0.0 en later print dezelfde aanroep de enkele tekenreeks "book" zonder de regel 'Levels'.

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

Output:

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

Output:

## [1] 10 20 30 40

Door een enkele kolom te selecteren met df[,1] wordt de frame-wrapper verwijderd en een gewone vector geretourneerd. Voeg drop = FALSE toe, zoals in df[, 1, drop = FALSE], wanneer een dataframe met één kolom nodig is.

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

Output:

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

Het is ook mogelijk om de kolommen te selecteren op basis van hun namen. Bijvoorbeeld, de onderstaande codetracHet heeft twee kolommen: ID en winkel.

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

Output:

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

Namen zijn veiliger dan posities in productiecode, omdat het invoegen of herschikken van een kolom stilzwijgend verandert waarnaar df[, 3] verwijst, terwijl df[, 'store'] naar dezelfde gegevens blijft verwijzen.

Voeg een kolom toe aan het gegevensframe

Je kunt ook een kolom toevoegen aan een DataFrame. Gebruik hiervoor het symbool $ om de nieuwe variabele een naam te geven en een kolom toe te voegen aan een DataFrame in R.

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

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

Output:

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

Let op: het aantal elementen in de vector moet gelijk zijn aan het aantal elementen in het dataframe. Voer de volgende instructie uit om een ​​kolom toe te voegen aan het dataframe in R.

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

Geeft fout:

Error in `

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

Het bericht noemt de vervangingsoperator voor dataframes en vermeldt beide aantallen, zodat je precies weet wat je moet aanpassen. R hergebruikt een vervanging alleen als de lengte ervan het aantal rijen gelijkmatig deelt. Daarom wordt een waarde met lengte 1, zoals df$currency <- 'EUR', geaccepteerd, terwijl een vector met lengte 3 bij vier rijen wordt geweigerd. cbind() voegt op dezelfde manier een kolom toe, en rbind() is de tegenhanger voor het toevoegen van rijen.

Selecteer een kolom van een gegevensframe

Soms moeten we een kolom van een dataframe opslaan voor later gebruik of een bewerking op een kolom uitvoeren. We kunnen het dollarteken ($) gebruiken om de kolom uit een dataframe te selecteren.

# Select the column ID
df$ID

Output:

## [1] 1 2 3 4

Lees die uitvoer zorgvuldig. ID is opgebouwd uit de vector c(10, 20, 30, 40), dus een live console print hier 10 20 30 40; de 1 2 3 4 die hierboven worden weergegeven, zijn rijposities en niet de opgeslagen waarden. De [1] aan het begin van de regel is simpelweg de index van het eerste element op die regel, geen onderdeel van de data.

Drie routes leiden naar dezelfde kolom: df$ID, df[['ID']] en df[, 'ID']. Het dollarteken zorgt voor een gedeeltelijke overeenkomst, dus df$I zou nog steeds ID vinden, wat handig is in de console maar riskant in een opgeslagen script.

Subset een gegevensframe

In de vorige sectie hebben we een volledige kolom zonder voorwaarde geselecteerd. Het is mogelijk om subgroep op basis van het feit of een bepaalde voorwaarde al dan niet waar was.

We gebruiken de functie subset().

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

We willen alleen artikelen retourneren met een prijs boven de 5, dus we kunnen het volgende doen:

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

Output:

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

De rijlabels 2, 3 en 4 zijn de oorspronkelijke rijnamen die zijn overgenomen uit df, waardoor je kunt zien dat de eerste rij is gefilterd. subset() accepteert ook een select-argument om tegelijkertijd kolommen te kiezen, en de equivalente vorm met haakjes is df[df$price > 5, ]. De vorm met haakjes behoudt rijen met NA-waarden waar de voorwaarde ontbreekt, terwijl subset() deze verwijdert, dus de twee zijn niet altijd uitwisselbaar.

Veelgestelde vragen

Gebruik rbind(df, new_row), waarbij new_row een dataframe of lijst is met dezelfde kolommen in dezelfde volgorde. De kolomtypen moeten overeenkomen, anders zet R ze om. Voor veel rijen is het beter om eerst een lijst te maken en deze één keer te combineren, omdat herhaalde aanroepen van rbind() traag zijn.

Wijs er NULL aan toe, zoals in df$quantity <- NULL. Negatieve indexering werkt ook: df[, -3] verwijdert de derde kolom, en df[, !names(df) %in% c("store")] verwijdert kolommen op naam, ongeacht hun positie.

dim(df) geeft rijen en kolommen samen terug, terwijl nrow() en ncol() ze afzonderlijk teruggeven. str(df) print het type van elke kolom, summary(df) geeft statistieken per kolom en head(df) toont de eerste zes rijen.

Indexeer de namenvector: names(df)[2] <- "product" wijzigt alleen de tweede koptekst. Om te hernoemen op basis van de huidige naam, gebruikt u names(df)[names(df) == "items"] <- "product", wat blijft werken, zelfs nadat de kolomvolgorde is gewijzigd.

Een tibble is het dataframe van de tidyverse. Het converteert nooit strings naar factoren, komt nooit gedeeltelijk overeen met kolomnamen, print alleen de eerste tien rijen met kolomtypen en retourneert altijd een tibble wanneer er met een enkele haak een subset wordt gemaakt.

filter(df, price > 5) is de dplyr Het is equivalent en het kan via de pipe worden gekoppeld aan select(), mutate() en arrange(). In tegenstelling tot subset(), is filter() ontworpen voor programmatisch gebruik, waardoor het zich voorspelbaar gedraagt ​​binnen functies.

AI-assistenten lezen de uitvoer van str() en summary() en stellen vervolgens typeconversies, strategieën voor ontbrekende waarden en kolomhernoemingen voor als uitvoerbare code. Ze leggen ook cryptische vervangingsfouten uit, hoewel elke gegenereerde transformatie nog steeds moet worden gecontroleerd aan de hand van de werkelijke gegevens.

Ja. GitHub-copiloot loopt binnen RStudio Vanaf versie 2023.09.0 via Extra, Algemene opties en vervolgens de instelling voor de codeassistent. Deze genereert aanroepen naar data.frame(), subset() en rbind() vanuit een opmerking, maar de kolomnamen moeten wel worden gecontroleerd.

Vat dit bericht samen met: