R Data Frame: come creare, aggiungere, selezionare e sottoinsieme

โšก Riepilogo intelligente

R DataFrame memorizza colonne di diversi tipi di uguale lunghezza, il che lo rende la struttura rettangolare standard per l'analisi. Le parentesi quadre separano righe e colonne, il simbolo del dollaro raggiunge una colonna e subset() filtra in base a una condizione.

  • ๐Ÿงฑ struttura: Un data frame รจ un elenco di vettori di uguale lunghezza, quindi ogni colonna puรฒ contenere un tipo diverso.
  • ๏ธ Creazione: data.frame(a, b, c, d) unisce quattro vettori e names() rinomina ogni colonna successivamente.
  • โœ‚๏ธ Affettare: df[A, B] si legge prima come righe e poi come colonne, e un lato vuoto seleziona tutto ciรฒ che si trova su quel lato.
  • โž• In aggiunta: df$quantity assegna una nuova colonna, a condizione che il nuovo vettore corrisponda esattamente al numero di righe.
  • ๐Ÿ”Ž Filtering: subset(df, subset = price > 5) mantiene solo le righe in cui la condizione risulta vera.
  • โš ๏ธ Versione Shift: Dalla versione 4.0.0 di R, il valore predefinito di stringsAsFactors รจ FALSE, quindi le colonne di testo rimangono di tipo carattere.

R Data Frame Crea Aggiungi Seleziona e Sottoinsieme

Cos'รจ un frame di dati?

A Frame dati Una matrice รจ un elenco di vettori di uguale lunghezza. Una matrice contiene un solo tipo di dati, mentre un data frame accetta diversi tipi di dati (numerico, carattere, fattore, ecc.).

Questa definizione colloca il data frame tra due vicini che incontrerai costantemente in R. matrice รจ rettangolare ma di un solo tipo, e un stratagemma รจ multitipo ma irregolare. Il data frame prende in prestito una proprietร  da ciascuno.

Structure Tipi di colonne lunghezze degli elementi Utilizzo tipico
Vettoriale (Vector) Un solo tipo Sequenza singola Una variabile
Matrice Un solo tipo Flacone Algebra numerica
Lista Qualsiasi combinazione di tipi Puรฒ variare a seconda dell'elemento Collezioni arbitrarie
Frame di dati Qualsiasi combinazione di tipi Ogni colonna ha la stessa lunghezza Analisi tabellare

Poichรฉ un data frame รจ in realtร  una lista sottostante, gli accessi utilizzati sulle liste funzionano anche qui, ed รจ per questo che il simbolo del dollaro ricompare piรน avanti in questo tutorial.

Come creare un frame di dati

Possiamo creare un dataframe in R Passando le variabili a, b, c e d alla funzione data.frame(), possiamo creare il data frame e assegnare un nome alle colonne con names(), specificando semplicemente il nome di ciascuna variabile.

data.frame(df, stringsAsFactors = TRUE)

argomenti:

  • df: Puรฒ essere una matrice da convertire come frame di dati o una raccolta di variabili da unire
  • stringsAsFactors: Controlla se i vettori di caratteri diventano colonne fattoriali. Il valore predefinito di fabbrica era TRUE nelle versioni precedenti ed รจ FALSE dalla versione R 4.0.0, quindi passalo esplicitamente quando il comportamento รจ importante.

Possiamo creare un dataframe in R per il nostro primo set di dati combinando quattro variabili della stessa lunghezza.

# 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

Produzione:

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

Ciascun vettore รจ diventato una colonna e i quattro valori in ciascun vettore sono diventati le quattro righe. Si noti che gli argomenti non avevano un nome, quindi R ha derivato le intestazioni di colonna dai nomi delle variabili stesse.

Possiamo vedere che le intestazioni delle colonne hanno lo stesso nome delle variabili. Possiamo cambiare il nome della colonna in R con la funzione nomi(). Controlla l'esempio di creazione di dataframe di R di seguito:

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

Produzione:

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

L'assegnazione a names() sostituisce tutte le intestazioni contemporaneamente, quindi il vettore di sostituzione deve contenere esattamente una voce per colonna. Per rinominare una singola colonna, invece, รจ necessario indicizzare il vettore names, come in names(df)[2] <- 'product'.

# Print the structure
str(df)

Produzione:

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

Nota sulla versione. L'output sopra รจ stato prodotto su una versione di R precedente alla 4.0.0, in cui data.frame() convertiva i vettori di caratteri in fattori per impostazione predefinita, motivo per cui items viene riportato come un fattore con quattro livelli. La documentazione di base di R riporta che questa impostazione predefinita di fabbrica modificato in stringsAsFactors = FALSE per R 4.0.0. Eseguendo lo stesso codice su una versione corrente, gli elementi vengono visualizzati come una semplice colonna di caratteri e str() stampa chr invece. Aggiungi stringsAsFactors = TRUE alla chiamata data.frame() per riprodurre l'output stampato oppure leggi il tutorial sui fattori per quando i fattori sono effettivamente necessari.

Taglia frame dati

Una volta costruita la struttura, il compito successivo รจ quello di estrarne alcune parti. Lo slicing รจ il metodo base di R per farlo e utilizza le stesse parentesi quadre dei vettori, solo con due posizioni invece di una.

รˆ possibile suddividere un DataFrame in sezioni (SLITTE). Selezioniamo le righe e le colonne da restituire tra parentesi quadre, precedute dal nome del DataFrame.

Un frame di dati รจ composto da righe e colonne, df[A, B]. A rappresenta le righe e B le colonne. Possiamo suddividere specificando le righe e/o le colonne.

Dalla foto 1 qui sotto, la parte sinistra rappresenta la righe, e la parte destra รจ la colonne. Si noti che il simbolo: significa a. Ad esempio, 1:3 intende selezionare i valori da 1 a 3.

Sintassi di slicing del data frame R df[A, B] con righe a sinistra della virgola e colonne a destra

Nel diagramma sottostante viene mostrato come accedere a diverse selezioni del dataframe:

Frecce colorate su un data frame di R che mostrano selezioni di singole celle, intervalli di righe, intere colonne e blocchi.

  • La freccia gialla seleziona il fila 1 in colonna 2
  • La freccia verde seleziona il righe 1 a 2
  • La freccia rossa seleziona il colonna 1
  • La freccia blu seleziona il righe Dal 1 al 3 e colonne 3 a 4

Nota che, se lasciamo vuota la parte sinistra, R selezionerร  tutte le righe. Per analogia, se lasciamo vuota la parte destra, R selezionerร  tutte le colonne.

Possiamo eseguire il codice nella console:

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

Produzione:

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

La riga "Livelli" appare perchรฉ "items" รจ un fattore in questa sessione. Su R 4.0.0 e versioni successive, la stessa chiamata stampa la singola stringa "book" senza la riga "Livelli".

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

Produzione:

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

Produzione:

## [1] 10 20 30 40

Selezionando una singola colonna con df[,1] si elimina il wrapper del frame e si restituisce un semplice vettore. Aggiungere drop = FALSE, come in df[, 1, drop = FALSE], quando รจ necessario un data frame a una sola colonna.

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

Produzione:

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

รˆ anche possibile selezionare le colonne con i loro nomi. Ad esempio, il codice seguente mostratracLe sue due colonne: ID e negozio.

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

Produzione:

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

Nel codice di produzione, i nomi sono piรน sicuri delle posizioni, perchรฉ l'inserimento o il riordino di una colonna modifica silenziosamente ciรฒ a cui fa riferimento df[, 3], mentre df[, 'store'] continua a puntare agli stessi dati.

Aggiungi una colonna al frame di dati

รˆ anche possibile aggiungere una colonna a un DataFrame. Per aggiungere una colonna a un DataFrame in R, รจ necessario utilizzare il simbolo $ per assegnare un nome alla nuova variabile.

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

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

Produzione:

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

Nota: il numero di elementi nel vettore deve essere uguale al numero di elementi nel data frame. Eseguire la seguente istruzione per aggiungere una colonna al data frame in R

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

Dร  errore:

Error in `

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

Il messaggio specifica l'operatore di sostituzione per i data frame e indica entrambi i conteggi, quindi ti dice esattamente cosa correggere. R ricicla una sostituzione solo quando la sua lunghezza divide esattamente il numero di righe, motivo per cui un valore di lunghezza 1 come df$currency <- 'EUR' viene accettato mentre un vettore di lunghezza 3 rispetto a quattro righe viene rifiutato. cbind() aggiunge una colonna allo stesso modo e rbind() รจ la sua controparte per l'aggiunta di righe.

Seleziona una colonna di un frame di dati

A volte, รจ necessario memorizzare una colonna di un data frame per un utilizzo futuro o eseguire un'operazione su una colonna. Possiamo usare il simbolo $ per selezionare la colonna da un data frame.

# Select the column ID
df$ID

Produzione:

## [1] 1 2 3 4

Leggete attentamente quell'output. ID รจ stato costruito dal vettore c(10, 20, 30, 40), quindi una console live stampa 10 20 30 40 qui; 1 2 3 4 mostrato sopra sono le posizioni di riga e non i valori memorizzati. [1] all'inizio della riga รจ semplicemente l'indice del primo elemento su quella riga, non fa parte dei dati.

Tre percorsi raggiungono la stessa colonna: df$ID, df[['ID']] e df[, 'ID']. Il simbolo del dollaro esegue una corrispondenza parziale, quindi df$I troverebbe comunque ID, il che รจ comodo nella console ma rischioso in uno script salvato.

Sottoimposta un frame di dati

Nella sezione precedente abbiamo selezionato un'intera colonna senza condizione. รˆ possibile sottoinsieme in base al fatto che una determinata condizione fosse vera o meno.

Usiamo la funzione subset().

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

Vogliamo restituire solo gli articoli con un prezzo superiore a 5, quindi possiamo fare:

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

Produzione:

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

Le etichette di riga 2, 3 e 4 sono i nomi di riga originali ereditati da df, ed รจ cosรฌ che si puรฒ capire che la prima riga รจ stata filtrata. subset() accetta anche un argomento select per scegliere le colonne contemporaneamente, e la forma equivalente tra parentesi รจ df[df$price > 5, ]. La forma tra parentesi mantiene le righe NA dove la condizione non รจ soddisfatta, mentre subset() le elimina, quindi le due non sono sempre intercambiabili.

DOMANDE FREQUENTI

Utilizza rbind(df, new_row), dove new_row รจ un data frame o una lista con le stesse colonne nello stesso ordine. I tipi di colonna devono corrispondere, altrimenti R li converte automaticamente. Per molte righe, crea prima una lista e combinala una sola volta, perchรฉ le chiamate ripetute a rbind() sono lente.

Assegna NULL al valore, come in df$quantity <- NULL. Funziona anche l'indicizzazione negativa: df[, -3] elimina la terza colonna e df[, !names(df) %in% c("store")] rimuove le colonne per nome senza dipendere dalla loro posizione.

dim(df) restituisce righe e colonne insieme, mentre nrow() e ncol() le restituiscono separatamente. str(df) stampa il tipo di ogni colonna, summary(df) fornisce statistiche per colonna e head(df) mostra le prime sei righe.

Indicizza il vettore dei nomi: names(df)[2] <- "product" modifica solo la seconda intestazione. Per rinominare in base al nome corrente, usa names(df)[names(df) == "items"] <- "product", che continua a funzionare anche dopo che l'ordine delle colonne cambia.

Un tibble รจ il data frame di tidyverse. Non converte mai le stringhe in fattori, non effettua mai corrispondenze parziali con i nomi delle colonne, stampa solo le prime dieci righe con i tipi di colonna e restituisce sempre un tibble quando viene selezionato un sottoinsieme con una singola parentesi.

filter(df, price > 5) รจ il dplyr รˆ equivalente e si concatena con select(), mutate() e arrange() attraverso la pipe. A differenza di subset(), filter() รจ progettato per l'uso programmatico, quindi si comporta in modo prevedibile all'interno delle funzioni.

Gli assistenti basati sull'IA leggono l'output delle funzioni str() e summary(), quindi propongono conversioni di tipo, strategie per i valori mancanti e ridenominazioni di colonne sotto forma di codice eseguibile. Spiegano anche gli errori di sostituzione piรน complessi, sebbene ogni trasformazione generata debba comunque essere verificata rispetto ai dati reali.

Sรฌ. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub corre dentro RStudio Dalla versione 2023.09.0 in poi, tramite Strumenti, Opzioni globali, quindi l'impostazione dell'assistente di codice. Crea automaticamente le chiamate a data.frame(), subset() e rbind() da un commento, ma i nomi delle colonne devono essere verificati.

Riassumi questo post con: