Le seguenti interrogazioni sono formulate nel linguaggio dplyr. Riscriverle in base R, ossia senza l’uso della libreria dplyr.
# dplyr
filter(flights, month == 12 & day == 25)
# base R
subset(flights, month == 12 & day == 25)
# dplyr
filter(flights, dep_delay > 0) %>%
arrange(desc(dep_delay))
# base R
df = subset(flights, dep_delay > 0)
df[order(desc(df$dep_delay)), ]
# 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"))
Descrivere la differenza tra semi-join e anti-join, avvalendosi di un esempio.
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)
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>))
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)
}