Sempre nell’ambito delle basi di R, vediamo come estrarre dei sottoinsiemi di elementi dai nostri oggetti di R. E’ quello che in altri linguaggi di programmazione, come Python, è chiamato slicing, mentre in R lo chiamiamo subsetting. Possiamo utilizzare a tale scopo gli operatori binari che abbiamo affrontato qualche paragrafo fa. Come sempre, se vogliamo storare i risultati relativi ai dati estratti da un set di dati, dobbiamo sempre ricordarci di creare un oggetto, attribuendogli un nome e utilizzando il vettore di assegnazione “gets”, ossia:
x <- 1:50[/code]
Adesso che abbiamo creato questo oggetto, è importante per comprendere le basi di R, estrarne dei sottoinsiemi di dati, ad esempio:
x > 25
# in questo caso avremo un operatore logico che ci restituisce per ogni elemento che compone x, la risposta se sia o meno maggiore di 25[/code]
Per estrarre gli elementi in forma numerica:
x [x > 17] [/code]
Se vogliamo storare il sottoinsieme in un nuovo oggetto, oppure sovrascrivere x, dobbiamo sempre utilizzare il vettore di attribuzione in questo modo:
y <- x[x<10]
# stampiamo y
y[/code]
Come facciamo invece, dato un oggetto, a sapere se contiene o meno dei dati? Ad esempio con il vettore %in%:
Ricordate sempre che in questo caso stiamo estraendo dei dati da un vettore, se volessimo estrarre degli elementi da un dataset bidimensionale, come una matrice o un dataframe, dovremo identificare le righe o le colonne:
iris[, 3]
# la virgola all’inizio significa che non stiamo prendendo in considerazione le righe, ma solo la terza colonna
iris[5:7,]
# in questo modo, invece, stiamo estraendo i casi dal quinto al settimo, ma non le variabili[/code]
Un modo per ottenere gli stessi dati che abbiamo appena estratto è usare la funzione subset():
Per creare dei sottoinsiemi possiamo utilizzare i vari operatori che abbiamo visto precedentemente, non solo maggiore e minore, ma anche uguale, diverso, eccetera. Ad esempio, possiamo eliminare i dati mancanti di un vettore z in questa maniera:
y <- z[!is.na(z)] [/code]
Possiamo anche, creato un oggetto, estrarne tutti gli elementi salvo ad esempio il quarto e il settimo. Tale operazione può essere espressa con due notazioni equivalenti:
x <- 20:30
# estraiamone tutti i valori tranne il quarto e il settimo
x[c(-4, -7)]
# oppure facciamo la stessa cosa in questa maniera
x[-c(4,7)]
[/code]
Una volta creati uno o più oggetti, possiamo anche estrarre da questi un campione, con la funzione sample:
x <- rnorm(1000, 3)
# creiamo un oggetto y di 500 elementi
y <- rnorm(500)
# estraiamo un campione casuale di 10 elementi con la funzione sample(), creando un altro oggetto che chiamiamo 10
z <- sample(c(x,y), 10)[/code]
Possiamo anche utilizzare gli operatori visti in precedenza per estrarre alcuni dati da una variabile, ad esempio:
Nell’esempio qua sopra storiamo nella variabile z gli elementi dell’oggetto x, contenuti $ nella variabile var4, che sono maggiori di 5 (>5).
Possiamo anche ordinare un set di dati in base a una o più variabili:
In questo caso l’oggetto x viene ordinato prima in base ai valori della sua variabile var4, e poi in base ai valori della sua variabile var5. Possiamo ottenere lo stesso risultato con la funzione arrange():
In questo caso il primo argomento è dato dall’oggetto, e il secondo è dato dalla variabile.
Possiamo anche sostituire un elemento, ad esempio di un vettore, con un altro:
x <- c(1, 2, 2, 1, 3, 3, 1, 2, 4, 1, 3, 3, 1, 3, 3, 4, 3, 4, 1)
# adesso sostituiamo tutti gli uno con dei 5
x[x == 1] <- 5
# stampiamo il nuovo vettore x
x[/code]
Abbiamo già visto come creare dei vettori casuali tramite la funzione sample(). Questa può anche essere utilizzata per l’estrazione di campioni casuali da un dataset. Vediamo un esempio che ci permette di comprendere queste basi di R:
In questo caso, dal dataset iris, estraiamo 50 casi in maniera casuale. Possiamo selezionare delle variabili di un dataframe anche con la funzione attach(). La funzione attach() crea una copia temporanea del nostro dataset nell’ambiente di lavoro.
attach(iris)
# adesso applichiamo la funzione summary a una della variabili di iris
summary(Petal.Length)
# per cancellare la funzione attach() usiamo la funzione detach()
detach(iris)[/code]
Un’alternativa alla funzione attach() è la funzione with():
Estrarre dei sottoinsiemi di dati è uno degli elementi che compongono le basi di R, capire come funziona il meccanismo di subsetting è fondamentale nell’analisi dei dati. Nei prossimi post vedremo come importare dei dati su R, utilizzare le strutture di controllo, e creare una funzione. Se questi post non ti bastano e cerchi qualcosa di più approfondito, puoi dare un’occhiata anche al corso base di R.
Buonasera, vorrei sapere come contare le le osservazione di sottogruppo del dataset.. Se ad esempio voglio contare quanti casi nel dataset Iris appartengono alla Specie “A” e contemporanemate hanno una lunghezza maggiore di un certo numero, come posso fare?
Ciao Alessandro,
puoi fare in vari modi, ti faccio qualche esempio:
# qui utilizzi ad esempio nrow(), ossia il numero delle righe e concateni il subsetting direttamente nella stessa riga
nrow(iris[iris$Petal.Length > 4 & iris$Sepal.Width < 5 ,]) # qui invece ho salvato in un oggetto il risultato del subsetting e poi utilizzo sull'oggetto creato la funzione dim() sub1 <- iris[iris$Petal.Length > 4 & iris$Sepal.Width < 5 ,] dim(sub1) # oppure con la grammatica del tidyverse e il pacchetto dplyr library(dplyr) iris %>% filter(Species == 'virginica', Petal.Length <= 5) %>% count()
Buongiorno
Vorrei sapere come faccio da un sottoinsieme contenente sia valori che parole ad estrarne solo i valori per poter poi fare un istogramma ? Grazie
Ciao Valentina, ho un dubbio riguardo a questa riga di codice:
“campione.casuale <- iris[sample(1:nrow(iris), 50, replace=FALSE),]"
Ho provato a farlo estraendo 1 solo elemento alla volta da una restrizione di 3 elementi (per fare un test), e pensavo che con l'opzione "replace=FALSE" se eseguivo il blocco di codice di nuovo l'elemento sarebbe stato cancellato da quei 3 e con l'esecuzione successiva me ne estraesse un altro casualmente dai 2 rimasti. Invece no. Come posso ovviare questo problema?
Buongiorno. avrei bisogno di sapere come estrarre in maniera casuale una variabile da una matrice, in particolare avrei bisogno di estrarre da una matrice non quadrata due variabili, qualcuno può aiutarmi?
Ciao Valentina,
sto esplorando un corpus di documenti dopo aver acquistato e seguito con soddisfazione due tuoi corsi su Udemy.
Spero tu possa aiutarmi. Vorrei creare un subset di un data frame a partire da dati presi da un altro dataframe. Mi spiego meglio: ho un un dataframe composto da due colonne (testo, data) e un secondo dataframe (testo, categoria, data). voglio creare subset del primo partendo da tutte o alcune delle date del secondo. Ho creato un ciclo ma nel nuovo dataframe mi ritrovo solo le corrispondenze legate all’ultimo record del secondo dataframe
for(y in seq(length(eventi[,3]))) {
Date_eventi<- eventi[y,3]
estrazione_data_evento Date_eventi -7 & sogni_x_data$data < Date_eventi +7,]
}
eventi[y,3] (sono le date del secondo dataframe
sogni_x_data è il primo dataframe
Spero in un tuo suggerimento
grazie
Luca