Estrarre dei sottoinsiemi dai nostri oggetti – basi di R

Home/R/Estrarre dei sottoinsiemi dai nostri oggetti – basi di R

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:

[code] # creiamo una sequenza di numeri da 1 a 50 e la chiamiamo x
x <- 1:50[/code]

Adesso che abbiamo creato questo oggetto, è importante per comprendere le basi di R, estrarne dei sottoinsiemi di dati, ad esempio:

[code] # tutti i valori di x maggiori di 25
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:

[code] # estraiamo gli elementi di x maggiori di 17
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:

[code] # creiamo un oggetto y e gli attribuiamo gli elementi di x minori di dieci
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%:

[code] x%in%c(58,147,22,69,49,13)[/code]

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:

[code] # ad esempio in questo modo, dal database iris, estraiamo solo i dati della terza colonna
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():

[code] subset(Orange, Orange$Tree == 4)[/code]

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:

[code] # creiamo un vettore y dove andremo a registrare tutti gli elementi di z che sono diversi da na (not available, ossia valori mancanti)
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:

[code] # creiamo un vettore x che contiene una sequenza di numeri da venti a trenta
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:

[code] # creiamo un oggetto x con la funzione rnorm che contenga 1000 elementi con media 3
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:

[code] z <- x[which(x$var4 > 5),] [/code]

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:

[code] x[order(x$var4, x$var5), ] [/code]

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():

[code] arrange(x, var4)[/code]

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:

[code] # creiamo un vettore x
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:

[code] campione.casuale <- iris[sample(1:nrow(iris), 50, replace=FALSE),] campione.casuale[/code]

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.

[code] # usiamo la funzione attach sul dataset iris
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():

[code] with(iris, summary(Petal.Length))[/code]

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.

About the Author:

6 Comments

  1. Alessandro March 29, 2019 at 14:28 - Reply

    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?

    • valentina April 2, 2019 at 07:44 - Reply

      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()

  2. Marwan May 28, 2019 at 13:45 - Reply

    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

  3. Pietro September 1, 2019 at 14:09 - Reply

    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?

  4. Alberto Robustelli March 15, 2021 at 14:00 - Reply

    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?

  5. Luca Mancusi February 19, 2022 at 10:56 - Reply

    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

Leave A Comment