Vai al contenuto principale

Sottoinsiemi di dataset in R

Creare sottoinsiemi di dataset è una competenza fondamentale per chi lavora con i dati. Impara e metti in pratica il subsetting dei dati in questo tutorial interattivo e veloce!
Aggiornato 29 set 2026  · 6 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

Che tu stia confrontando come diversi gruppi demografici rispondono alle campagne di marketing, concentrandoti su un intervallo temporale specifico o estraendo informazioni su pochi prodotti selezionati dall'inventario, creare sottoinsiemi ti permette di ottenere osservazioni utili dal tuo dataset. R è un ottimo strumento che rende il subsetting dei dati facile e intuitivo. Alla fine di questo tutorial saprai estrarre dal dataset esattamente le informazioni che ti interessano.

Creare un sottoinsieme non modifica il contenuto dei dati, ma seleziona semplicemente la porzione più rilevante per l'obiettivo che hai in mente. In generale, ci sono tre modi per creare sottoinsiemi di righe e colonne di un dataset—per indice, per nome e per valore.

Creare sottoinsiemi di righe e colonne per indice

Un modo per creare sottoinsiemi di righe e colonne è usare gli indici del dataset. È come descrivere le righe e le colonne come "la prima riga", "tutte le righe nelle colonne seconda e quinta" o "la prima riga nelle colonne dalla seconda alla quinta". Specifichiamo queste frasi usando un dataset chiamato iris in R. Dalla sua documentazione, "[q]uesto famoso dataset dell'iris (di Fisher o Anderson) fornisce le misure in centimetri delle variabili lunghezza e larghezza del sepalo e lunghezza e larghezza del petalo, rispettivamente, per 50 fiori di ciascuna delle 3 specie di iris. Le specie sono Iris setosa, versicolor e virginica."

# "La prima riga": iris[1, ] # "Tutte le righe nelle colonne seconda e quinta": iris[, c(2, 5)] # "La prima riga nelle colonne dalla seconda alla quinta": iris[1, 2:5]

Per creare un sottoinsieme dei dati si usano le parentesi quadre dopo l'oggetto dataset. Le righe del dataset si specificano come primo elemento dentro le parentesi quadre e le colonne come secondo elemento, separati da una virgola:

data[rows, columns]

Creare sottoinsiemi di righe e colonne per nome

In R, le righe e le colonne del dataset hanno attributi di nome. I nomi delle righe sono usati raramente e per impostazione predefinita forniscono indici—interi numerati da 1 al numero di righe del dataset—proprio come hai visto nella sezione precedente. Infatti, se chiamassi rownames() sul dataset iris, vedresti che sono indicizzate semplicemente da 1 a 150:

 > rownames(iris)
[1] "1"   "2"   "3"   "4"   "5"   "6"   "7"   "8"   "9"   "10"  "11"  "12"  "13"  "14"
[15] "15"  "16"  "17"  "18"  "19"  "20"  "21"  "22"  "23"  "24"  "25"  "26"  "27"  "28"
[29] "29"  "30"  "31"  "32"  "33"  "34"  "35"  "36"  "37"  "38"  "39"  "40"  "41"  "42"
[43] "43"  "44"  "45"  "46"  "47"  "48"  "49"  "50"  "51"  "52"  "53"  "54"  "55"  "56"
[57] "57"  "58"  "59"  "60"  "61"  "62"  "63"  "64"  "65"  "66"  "67"  "68"  "69"  "70"
[71] "71"  "72"  "73"  "74"  "75"  "76"  "77"  "78"  "79"  "80"  "81"  "82"  "83"  "84"
[85] "85"  "86"  "87"  "88"  "89"  "90"  "91"  "92"  "93"  "94"  "95"  "96"  "97"  "98"
[99] "99"  "100" "101" "102" "103" "104" "105" "106" "107" "108" "109" "110" "111" "112"
[113] "113" "114" "115" "116" "117" "118" "119" "120" "121" "122" "123" "124" "125" "126"
[127] "127" "128" "129" "130" "131" "132" "133" "134" "135" "136" "137" "138" "139" "140"
[141] "141" "142" "143" "144" "145" "146" "147" "148" "149" "150"

> nrow(iris)
[1] 150

I nomi delle righe sono più comuni in dataset piccoli e servono a rendere facilmente identificabili le osservazioni. Per esempio, per un piccolo dataset con le informazioni sanitarie dei pazienti di un medico, i nomi delle righe potrebbero essere i nomi completi dei pazienti.

I nomi delle colonne, invece, sono presenti in quasi tutti i dataset. Puoi accedervi con la funzione colnames() o con la funzione names():

colnames(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

Per creare sottoinsiemi del dataset usando i nomi di righe e colonne, usa semplicemente di nuovo le parentesi quadre, precedute dall'oggetto dataset:

# Larghezza del sepalo della quinta osservazione iris["5", "Sepal.Width"] # Larghezza del sepalo e larghezza del petalo iris[, c("Sepal.Width", "Petal.Width")]

È importante notare che sia i nomi delle righe che quelli delle colonne sono di tipo character, quindi usare gli apici singoli o doppi è assolutamente necessario!

Creare sottoinsiemi di righe e colonne per valore

Creare sottoinsiemi per valore offre spesso la massima flessibilità. Per esempio, puoi estrarre i dati su Iris setosa usando un'istruzione condizionale come questa:

> iris[iris$Species == "setosa", ]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa

...

47          5.1         3.8          1.6         0.2  setosa
48          4.6         3.2          1.4         0.2  setosa
49          5.3         3.7          1.5         0.2  setosa
50          5.0         3.3          1.4         0.2  setosa

I condizionali come iris$Species == "setosa" vanno nell'elemento delle righe tra parentesi quadre (cioè il primo elemento prima della virgola). Oltre all'istruzione condizionale nel primo elemento, puoi specificare le colonne per indice o per nome nel secondo elemento. Nella console qui sotto, prova a selezionare solo le misure dei sepali di Iris setosa:

# Stampa le misure dei sepali per setosa # Stampa le misure dei sepali per setosa (per nome) iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")] # Stampa le misure dei sepali per setosa (per indice) iris[iris$Species == "setosa", 1:2] test_or( test_output_contains('iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]', incorrect_msg = "Select just the Sepal.Length and Sepal.Width columns for the setosa iris either by name or index."), test_output_contains('iris[iris$Species == "setosa", c("Sepal.Width", "Sepal.Length")]', incorrect_msg = "Select just the Sepal.Length and Sepal.Width columns for the setosa iris either by name or index.")) success_msg("Great work!")

Riepilogo

In questo tutorial hai:

  • Imparato a creare sottoinsiemi del data frame per indice. Righe e colonne sono indicizzate come interi da 1 al numero di righe e di colonne, rispettivamente.
  • Imparato a creare sottoinsiemi del data frame per nome. Hai visto che i nomi delle righe sono raramente specificati e che i nomi delle colonne sono di tipo character.
  • Imparato a usare istruzioni condizionali nell'elemento delle righe tra parentesi quadre per creare sottoinsiemi del data frame per valore.
  • Imparato a combinare questi metodi per consentire un subsetting più flessibile (ad esempio, usando condizionali per le righe e creando sottoinsiemi per indice o per nome per le colonne).

Qui sotto trovi alcuni esercizi per consolidare quanto hai imparato. La pratica rende perfetti: prova a svolgerli!

Esercizi di pratica

Seleziona tutte le osservazioni per cui la larghezza del sepalo è maggiore della lunghezza del petalo.

# Quali osservazioni hanno la larghezza del sepalo maggiore della lunghezza del petalo? # Quali osservazioni hanno la larghezza del sepalo maggiore della lunghezza del petalo? iris[iris$Sepal.Width > iris$Petal.Length, ] test_output_contains('iris[iris$Sepal.Width > iris$Petal.Length, ]', incorrect_msg = paste("Select the observations for which Sepal.Width values", "are larger than Petal.Length values.")) success_msg("Nice! Turns out only Iris setosa have this shape.")
Usa iris$Sepal.Width > iris$Petal.Length dentro le parentesi quadre. Non dimenticare la virgola!

Seleziona tutte le Iris versicolor la cui larghezza del sepalo è maggiore della larghezza media del sepalo tra tutte le specie.

# Salva i dati di versicolor in un oggetto chiamato versicolor # Seleziona tutte le Iris versicolor con larghezza del sepalo superiore alla media # Salva i dati di versicolor in un oggetto chiamato versicolor versicolor <- iris[iris$Species == "versicolor", ] # Seleziona tutte le Iris versicolor con larghezza del sepalo superiore alla media versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ] test_object('versicolor', undefined_msg = "Did you define the versicolor object?", incorrect_msg = paste("Select where Species is equal to \"versicolor\".", "Remember to use the == operator!")) test_output_contains('versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]', incorrect_msg = paste("Not quite! Are you using the mean() function", "to find the average sepal width across all species", "and not just for Iris versicolor?")) success_msg("Great work!")
Usa la funzione mean() per trovare la larghezza media del sepalo in iris, poi usa un'istruzione condizionale con prefisso versicolor per selezionare solo quelle con valori superiori alla media.

Riporta la larghezza media del sepalo per tutte le Iris virginica che hanno lunghezze dei petali inferiori a 5 centimetri.

# Sei libero di affrontare questo problema come preferisci! # Salva i dati di virginica in un oggetto chiamato virginica virginica <- iris[iris$Species == "virginica", ] # Larghezza media del sepalo per Iris virginica con lunghezze dei petali inferiori a 5 mean(virginica[virginica$Petal.Length < 5, ]$Sepal.Width) test_output_contains('2.8', incorrect_msg = "Incorrect! This is a tough one!") success_msg("Excellent!")
Per prima cosa prova a creare il sottoinsieme per tutte le Iris virginica, poi per i casi in cui Petal.Length è inferiore a 5. Puoi trovare la media chiamando la funzione mean().

Vuoi saperne di più su altri modi per estrarre insight dai tuoi dati? Dai un'occhiata a questi corsi su DataCamp!

Dai un'occhiata anche al nostro tutorial Unire dataset in R.

Che tu stia confrontando come diversi gruppi demografici rispondono alle campagne di marketing, concentrandoti su un intervallo temporale specifico o estraendo informazioni su pochi prodotti selezionati dall'inventario, creare sottoinsiemi ti permette di ottenere osservazioni utili dal tuo dataset. R è un ottimo strumento che rende il subsetting dei dati facile e intuitivo. Alla fine di questo tutorial saprai estrarre dal dataset esattamente le informazioni che ti interessano.

Creare un sottoinsieme non modifica il contenuto dei dati, ma seleziona semplicemente la porzione più rilevante per l'obiettivo che hai in mente. In generale, ci sono tre modi per creare sottoinsiemi di righe e colonne di un dataset: per indice, per nome e per valore.

Creare sottoinsiemi di righe e colonne per indice

Un modo per creare sottoinsiemi di righe e colonne è usare gli indici del dataset. È come descrivere le righe e le colonne come "la prima riga", "tutte le righe nelle colonne seconda e quinta" o "la prima riga nelle colonne dalla seconda alla quinta". Specifichiamo queste frasi usando un dataset chiamato iris in R. Dalla sua documentazione, "[q]uesto famoso dataset dell'iris (di Fisher o Anderson) fornisce le misure in centimetri delle variabili lunghezza e larghezza del sepalo e lunghezza e larghezza del petalo, rispettivamente, per 50 fiori di ciascuna delle 3 specie di iris. Le specie sono Iris setosa, versicolor e virginica."

# "La prima riga": iris[1, ] # "Tutte le righe nelle colonne seconda e quinta": iris[, c(2, 5)] # "La prima riga nelle colonne dalla seconda alla quinta": iris[1, 2:5]

Per creare un sottoinsieme dei dati si usano le parentesi quadre dopo l'oggetto dataset. Le righe del dataset si specificano come primo elemento dentro le parentesi quadre e le colonne come secondo elemento, separati da una virgola:

data[rows, columns]

Creare sottoinsiemi di righe e colonne per nome

In R, le righe e le colonne del dataset hanno attributi di nome. I nomi delle righe sono usati raramente e per impostazione predefinita forniscono indici—interi numerati da 1 al numero di righe del dataset—proprio come hai visto nella sezione precedente. Infatti, se chiamassi rownames() sul dataset iris, vedresti che sono indicizzate semplicemente da 1 a 150:

 > rownames(iris)
[1] "1"   "2"   "3"   "4"   "5"   "6"   "7"   "8"   "9"   "10"  "11"  "12"  "13"  "14"
[15] "15"  "16"  "17"  "18"  "19"  "20"  "21"  "22"  "23"  "24"  "25"  "26"  "27"  "28"
[29] "29"  "30"  "31"  "32"  "33"  "34"  "35"  "36"  "37"  "38"  "39"  "40"  "41"  "42"
[43] "43"  "44"  "45"  "46"  "47"  "48"  "49"  "50"  "51"  "52"  "53"  "54"  "55"  "56"
[57] "57"  "58"  "59"  "60"  "61"  "62"  "63"  "64"  "65"  "66"  "67"  "68"  "69"  "70"
[71] "71"  "72"  "73"  "74"  "75"  "76"  "77"  "78"  "79"  "80"  "81"  "82"  "83"  "84"
[85] "85"  "86"  "87"  "88"  "89"  "90"  "91"  "92"  "93"  "94"  "95"  "96"  "97"  "98"
[99] "99"  "100" "101" "102" "103" "104" "105" "106" "107" "108" "109" "110" "111" "112"
[113] "113" "114" "115" "116" "117" "118" "119" "120" "121" "122" "123" "124" "125" "126"
[127] "127" "128" "129" "130" "131" "132" "133" "134" "135" "136" "137" "138" "139" "140"
[141] "141" "142" "143" "144" "145" "146" "147" "148" "149" "150"

> nrow(iris)
[1] 150

I nomi delle righe sono più comuni in dataset piccoli e servono a rendere facilmente identificabili le osservazioni. Per esempio, per un piccolo dataset con le informazioni sanitarie dei pazienti di un medico, i nomi delle righe potrebbero essere i nomi completi dei pazienti.

I nomi delle colonne, invece, sono presenti in quasi tutti i dataset. Puoi accedervi con la funzione colnames() o con la funzione names():

colnames(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

Per creare sottoinsiemi del dataset usando i nomi di righe e colonne, usa semplicemente di nuovo le parentesi quadre, precedute dall'oggetto dataset:

# Larghezza del sepalo della quinta osservazione iris["5", "Sepal.Width"] # Larghezza del sepalo e larghezza del petalo iris[, c("Sepal.Width", "Petal.Width")]

È importante notare che sia i nomi delle righe che quelli delle colonne sono di tipo character, quindi usare gli apici singoli o doppi è assolutamente necessario!

Creare sottoinsiemi di righe e colonne per valore

Creare sottoinsiemi per valore offre spesso la massima flessibilità. Per esempio, puoi estrarre i dati su Iris setosa usando un'istruzione condizionale come questa:

> iris[iris$Species == "setosa", ]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa

...

47          5.1         3.8          1.6         0.2  setosa
48          4.6         3.2          1.4         0.2  setosa
49          5.3         3.7          1.5         0.2  setosa
50          5.0         3.3          1.4         0.2  setosa

I condizionali come iris$Species == "setosa" vanno nell'elemento delle righe tra parentesi quadre (cioè il primo elemento prima della virgola). Oltre all'istruzione condizionale nel primo elemento, puoi specificare le colonne per indice o per nome nel secondo elemento. Nella console qui sotto, prova a selezionare solo le misure dei sepali di Iris setosa:

# Stampa le misure dei sepali per setosa # Stampa le misure dei sepali per setosa (per nome) iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")] # Stampa le misure dei sepali per setosa (per indice) iris[iris$Species == "setosa", 1:2] test_or( test_output_contains('iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]', incorrect_msg = "Select just the Sepal.Length and Sepal.Width columns for the setosa iris either by name or index."), test_output_contains('iris[iris$Species == "setosa", c("Sepal.Width", "Sepal.Length")]', incorrect_msg = "Select just the Sepal.Length and Sepal.Width columns for the setosa iris either by name or index.")) success_msg("Great work!")

Riepilogo

In questo tutorial hai:

  • Imparato a creare sottoinsiemi del data frame per indice. Righe e colonne sono indicizzate come interi da 1 al numero di righe e di colonne, rispettivamente.
  • Imparato a creare sottoinsiemi del data frame per nome. Hai visto che i nomi delle righe sono raramente specificati e che i nomi delle colonne sono di tipo character.
  • Imparato a usare istruzioni condizionali nell'elemento delle righe tra parentesi quadre per creare sottoinsiemi del data frame per valore.
  • Imparato a combinare questi metodi per consentire un subsetting più flessibile (ad esempio, usando condizionali per le righe e creando sottoinsiemi per indice o per nome per le colonne).

Qui sotto trovi alcuni esercizi per consolidare quanto hai imparato. La pratica rende perfetti: prova a svolgerli!

Esercizi di pratica

Seleziona tutte le osservazioni per cui la larghezza del sepalo è maggiore della lunghezza del petalo.

# Quali osservazioni hanno la larghezza del sepalo maggiore della lunghezza del petalo? # Quali osservazioni hanno la larghezza del sepalo maggiore della lunghezza del petalo? iris[iris$Sepal.Width > iris$Petal.Length, ] test_output_contains('iris[iris$Sepal.Width > iris$Petal.Length, ]', incorrect_msg = paste("Select the observations for which Sepal.Width values", "are larger than Petal.Length values.")) success_msg("Nice! Turns out only Iris setosa have this shape.")
Usa iris$Sepal.Width > iris$Petal.Length dentro le parentesi quadre. Non dimenticare la virgola!

Seleziona tutte le Iris versicolor la cui larghezza del sepalo è maggiore della larghezza media del sepalo tra tutte le specie.

# Salva i dati di versicolor in un oggetto chiamato versicolor # Seleziona tutte le Iris versicolor con larghezza del sepalo superiore alla media # Salva i dati di versicolor in un oggetto chiamato versicolor versicolor <- iris[iris$Species == "versicolor", ] # Seleziona tutte le Iris versicolor con larghezza del sepalo superiore alla media versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ] test_object('versicolor', undefined_msg = "Did you define the versicolor object?", incorrect_msg = paste("Select where Species is equal to \"versicolor\".", "Remember to use the == operator!")) test_output_contains('versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]', incorrect_msg = paste("Not quite! Are you using the mean() function", "to find the average sepal width across all species", "and not just for Iris versicolor?")) success_msg("Great work!")
Usa la funzione mean() per trovare la larghezza media del sepalo in iris, poi usa un'istruzione condizionale con prefisso versicolor per selezionare solo quelle con valori superiori alla media.

Riporta la larghezza media del sepalo per tutte le Iris virginica che hanno lunghezze dei petali inferiori a 5 centimetri.

# Sei libero di affrontare questo problema come preferisci! # Salva i dati di virginica in un oggetto chiamato virginica virginica <- iris[iris$Species == "virginica", ] # Larghezza media del sepalo per Iris virginica con lunghezze dei petali inferiori a 5 mean(virginica[virginica$Petal.Length < 5, ]$Sepal.Width) test_output_contains('2.8', incorrect_msg = "Incorrect! This is a tough one!") success_msg("Excellent!")
Per prima cosa prova a creare il sottoinsieme per tutte le Iris virginica, poi per i casi in cui Petal.Length è inferiore a 5. Puoi trovare la media chiamando la funzione mean().

Vuoi saperne di più su altri modi per estrarre insight dai tuoi dati? Dai un'occhiata a questi corsi su DataCamp!

Dai un'occhiata anche al nostro tutorial Unire dataset in R.

Argomenti
R
Data Science

Scopri di più su R

Corso

Manipolazione dei dati con dplyr

4 ore
175.2K
Migliora le tue abilità con Tidyverse imparando a trasformare e gestire i dati con dplyr.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro