Data Analytics
Intro R Data Frame
Introduzione ad R# Dati di partenza ----
country <- c("Italia", "Germania", "Francia", "Germania", "Germania", "Germania",
"Francia", "Italia", "Italia", "Francia")
countryf <- factor(country)
age <- c(47, 44, 44, 40, 38, 36, 42, 34, 34, 44)
gender <- c(1, 1, 2, 1, 1, 2, 1, 2, 2, 2)
genderf <- factor(gender)
levels(genderf) <- c("F", "M")
# Data Frame ----
under40 <- age < 40
dat <- data.frame(Country = countryf, Age = age, Sex = genderf,
Under40 = under40)
## Ispezione ----
str(dat)
is.data.frame(dat)
head(dat)
# View(dat) # apre la visualizzazione interattiva in RStudio
# Subsetting ----
dat[3, 2] # elemento in riga 3, colonna 2
dat[1:3, 2:4] # prime tre righe, colonne da 2 a 4
dat[3, ] # intera terza riga
## Selezione di colonne ----
dat[, c("Age", "Sex")] # per nome → restituisce data frame
dat[, c(2, 3)] # per indice numerico
dat[, 2:3] # per range di indici
dat$Sex # con $ → restituisce il vettore/factor
## dat["Age"] vs dat[, "Age"] ----
str(dat["Age"]) # → data.frame con 1 colonna
str(dat[, "Age"]) # → vettore numerico
x <- dat[, 2]
str(x)
# Modificare un Data Frame ----
## Eliminare una colonna ----
dat$Under40 <- NULL
head(dat)
# Equivalente con indice negativo (sovrascrive dat):
# dat <- dat[, -2]
## Aggiungere una colonna ----
cbind.data.frame(dat, under40)
X <- cbind.data.frame(dat, Under40 = under40 * 1) # logical → 0/1
X
## Creare una nuova variabile con condizione logica ----
dat$CountryTF <- dat$Country == "Italia"
head(dat)
# stringsAsFactors ----
df <- data.frame(x = 1:5,
y = c("A", "B", "C", "D", "E"))
str(df) # y è character
df <- data.frame(x = 1:5,
y = c("A", "B", "C", "D", "E"),
stringsAsFactors = TRUE)
str(df) # y è ora un factor
# attach() e detach() ---
# Age # ERRORE: Age non esiste nell'environment globale
attach(dat)
Age
dat$Age <- Age + 1
Age
detach(dat)
dat$Age
## Esercizio 1 ----
x <- runif(8)
y <- letters[1:8]
z <- sample(c(rep(TRUE, 5), rep(FALSE, 3)))
newdf <- data.frame(z = z, y = y, x = x)
str(newdf)
is.data.frame(newdf)
## Esercizio 2 ----
df <- data.frame(
nome = c("Alice", "Bob", "Carlo", "Diana", "Eva"),
eta = c(23, 31, 28, 22, 35)
)
# Metodo 1: condizione logica sulla colonna
df[df$eta > 25, ]
# Metodo 2: which()
df[which(df$eta > 25), ]
# R Base vs dplyr ----
# install.packages("dplyr") # la prima volta
library(dplyr)
df <- data.frame(
nome = c("Alice", "Bob", "Carlo", "Diana", "Eva"),
eta = c(23, 31, 28, 22, 35),
voto = c(28, 25, 30, 27, 29),
gruppo = c("A", "B", "A", "B", "A")
)
df
## filter() ---
df[df$eta > 25, ]
filter(df, eta > 25)
df |> filter(eta > 25)
df[df$eta > 25 & df$voto >= 28, ]
filter(df, eta > 25, voto >= 28)
df |> filter(eta > 25, voto >= 28)
## select() ---
df[, c("nome", "voto")]
select(df, nome, voto)
df |> select(-gruppo)
df[, -c(3, 4)]
select(df, -voto, -gruppo)
df |> select(-voto, -gruppo)
## mutate() ---
df$voto_norm <- df$voto / 30
df
df <- df[, -5]
mutate(df, voto_norm = voto / 30)
df |> mutate(voto_norm = voto / 30)
df |> mutate(voto_norm = voto / 30,
eta_class = ifelse(eta < 28, "giovane", "senior"))
df |> mutate(
voto_norm = voto / 30,
eta_class = ifelse(eta < 28, "giovane", "senior")
)
## rename() ---
rename(df, valutazione = voto)
df |> rename(valutazione = voto)
names(df)[names(df) == "voto"] <- "valutazione"
names(df)[names(df) == "valutazione"] <- "voto"
## arrange() ---
df[order(df$voto, decreasing = TRUE), ]
arrange(df, desc(voto))
df |> arrange(desc(voto))
df[order(df$gruppo, -df$voto), ]
df[order(df$gruppo, df$voto, decreasing = TRUE), ]
arrange(df, gruppo, desc(voto))
df |> arrange(gruppo, desc(voto))
## summarise() + group_by() ---
# R base
aggregate(voto ~ gruppo, data = df, FUN = mean)
tapply(df$voto, df$gruppo, mean)
# dplyr
df |>
group_by(gruppo) |>
summarise(
media_voto = mean(voto),
n = n()
)
# Più variabili simultaneamente
df |>
group_by(gruppo) |>
summarise(
n = n(),
media_voto = mean(voto),
media_eta = mean(eta)
)
## Pipeline completa ---
subset_df <- df[df$eta > 22, ]
agg <- aggregate(voto ~ gruppo, data = subset_df, FUN = mean)
agg[order(agg$voto, decreasing = TRUE), ]
df |>
filter(eta > 22) |>
group_by(gruppo) |>
summarise(media_voto = mean(voto)) |>
arrange(desc(media_voto))
# dplyr
df |>
group_by(gruppo) |>
summarise(
media_voto = mean(voto),
n = n()
)
# ESERCIZIO 3 — dplyr
# 1. Studenti del gruppo A
df |> filter(gruppo == "A")
# 2. Colonna promosso
df |> mutate(promosso = voto >= 28)
# 3. Conteggio promossi per gruppo
df |>
mutate(promosso = voto >= 28) |>
group_by(gruppo) |>
summarise(n_promossi = sum(promosso),
totale = n())
# DATASET CO2
data(CO2)
str(CO2)
# --- select() ---
CO2sub <- select(CO2, 2:5)
CO2sub <- select(CO2, Type, uptake)
CO2sub <- select(CO2, Type:uptake)
select(CO2, where(is.numeric))
CO2[, sapply(CO2, is.numeric)]
CO2sub <- select(CO2, ends_with("nt"))
CO2sub <- select(CO2, ends_with(c("nt", "e")))
CO2sub <- select(CO2, contains("on"))
CO2sub <- select(CO2, matches("a[nk]"))
# --- filter() ---
CO2filt <- filter(CO2, Type == "Mississippi" & uptake > 20)
# --- arrange() ---
CO2arr <- arrange(CO2, Plant)
CO2arr <- arrange(CO2, desc(Plant))
# --- rename() ---
CO2rename <- rename(CO2, Concentration = conc, UptakeRates = uptake)
# --- mutate() ---
CO2mutate <- mutate(CO2,
conc.scale = (conc - mean(conc)) / sd(conc),
uptake = uptake - mean(uptake))
summary(CO2mutate$uptake)
summary(CO2$uptake)
CO2mutate <- mutate(CO2, across(where(is.numeric), as.character))
str(CO2mutate)
# --- mutate() con NA ---
CO2NA <- mutate(CO2, concNA = ifelse(conc < 100, NA, conc))
colSums(is.na(CO2NA))
colMeans(is.na(CO2NA))
any(is.na(CO2NA))
sum(complete.cases(CO2NA))
CO2clean <- CO2NA[complete.cases(CO2NA), ]
any(is.na(CO2clean))
CO2mutate <- mutate(CO2NA,
conc.scale = (concNA - mean(concNA)) / sd(concNA))
CO2mutateNA <- mutate(CO2NA,
conc.scale = (concNA - mean(concNA, na.rm = TRUE)) /
sd(concNA, na.rm = TRUE))
# --- transmute() / .keep = "none" ---
CO2trmute <- transmute(CO2,
conc = (conc - mean(conc)) / sd(conc),
uptake = uptake - mean(uptake))
CO2mutateKeepNone <- mutate(CO2,
conc = (conc - mean(conc)) / sd(conc),
uptake = uptake - mean(uptake),
.keep = "none")
# --- group_by() + summarise() ---
CO2group <- group_by(CO2, Type)
str(CO2group)
summarise(CO2group,
uptMean = mean(uptake),
uptMedian = quantile(uptake, 0.5))