Esercizio 1

Le seguenti interrogazioni sono formulate nel linguaggio dplyr. Riscriverle in base R, ossia senza l’uso della libreria dplyr.

  1. flights on Christmas
# dplyr
filter(flights, month == 12 & day == 25)
# base R
subset(flights, month == 12 & day == 25)
  1. flights that have a positive (greater than 0) departure delay sorted by delay
# dplyr
filter(flights, dep_delay > 0) %>%
  arrange(desc(dep_delay))
# base R
df = subset(flights, dep_delay > 0)
df[order(desc(df$dep_delay)), ]
  1. flights that flew with a plane manufactured by BOEING
# dplyr
inner_join(flights, filter(planes, manufacturer == "BOEING"),  by="tailnum") %>%
  select(id, tailnum, manufacturer)
# base R (inner join)
df = merge(flights, subset(planes, manufacturer == "BOEING"), by="tailnum")
df = subset(df, select = c("id", "tailnum", "manufacturer"))

Esercizio 2

Descrivere la differenza tra semi-join e anti-join, avvalendosi di un esempio.

Esercizio 3

Si considerei il seguente schema relazionale che descrive blocchi e transazioni di una blockchain.

block(hashBlock, timestamp, miner)
transaction(hashTrans, from, to, value, hashBlock)
transaction(hashBlock) –> block(hashBlock)

Usare la funzione anti-join di dplyr per verificare se il vincolo di chiave esterna è verificato.

transaction %>%
  anti_join(block) %>%
  count(hashBlock, sort = TRUE)

Esercizio 4

Descrivere le componenti DATA FRAME, GEOMETRIC OBJECT, e MAPPINGS del seguente template per produrre grafica con la libreria ggplot2:

ggplot(data = <DATA FRAME>) + 
  <GEOMETRIC OBJECT>(mapping = aes(<MAPPINGS>))

Esercizio 5

Scrivere in R una versione efficiente della seguente funzione:

growingSlow <- function(n) {
    x <- NULL
    for(i in 1:n) x <- c(x, rnorm(1))
    x
}
growingFast <- function(n) {
    x <- numeric(n) # Pre-allocate
    for(i in 1:n) x[i] <- rnorm(1)
    x
}

growingSuperFast <- function(n) {
  rnorm(n)
}