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