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.

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.
Nel diagramma sottostante viene mostrato come accedere a diverse selezioni del dataframe:
- 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.

![Sintassi di slicing del data frame R df[A, B] con righe a sinistra della virgola e colonne a destra](https://www.guru99.com/images/r_programming/032918_1452_RDataFrames1.png)
