vuoi
o PayPal
tutte le volte che vuoi
M[3, 2]; M[3, 4]; M[3, c(2, 4)] <- 0
Creare due matrici 2x3, A e B, ed eseguirne la somma, il prodotto, la sottrazione e la divisione
“elemento per elemento”
A <- matrix(seq(1, 10, length.out=6), nrow=2, ncol=3)
B <- matrix(seq(-5, 5, length.out=6), nrow=2, ncol=3)
A + B; A - B; A * B; A / B
Estrarre dalla matrice al punto 2 la sottomatrice contenente le righe la somma dei cui valori
sia maggiore 7
M[rowSums(M) > 7, ]
Determinare il massimo e il minimo di ogni riga e di ogni colonna (consiglio: usare la funzione
range()
range(M[1, ]); range(M[, 1])
range(M[2, ]); range(M[, 2])
range(M[3, ]); range(M[, 3])
range(M[4, ]); range(M[, 4])
range(M[5, ]); range(M[, 5])
Lezione5
which() prende come argomento una condizione applicata a un vettore e restituisce gli indici
degli elementi del vettore dove la condizione è vera. Spesso il comando which si usa in coppia
con il comando %in%
source(“nomescript”) carica uno script, ovvero un file contenente solo le istruzioni R
(rm(list=ls() ) cancella il contenuto del workspace
Caricare l'archivio R dataFL.Rdata
Esercizio:
load("dataFL.Rdata")
dataFL <- as.vector(dataFL) #per essere sicuri che lo tratti come vettore
Contare quante misurazioni cadono nell'intervallo [90, 101) (90 incluso, 101 escluso)
cat("numero misurazioni in [90,101):", sum(dataFL >= 90 & dataFL < 101), "\n")
Verificare se la misurazione 92 è presente nei dati
print(paste0("92 presente in dataFL: ", 92 %in% dataFL))
#Si noti la differenza con cat: print non concatena automaticamente i suoi argomenti e li
converte in stringhe, lo facciamo noi con paste0()
Calcolare le posizioni nel vettore dataFL delle misurazioni pari a 92
cat("92 in posizione:", which(dataFL == 92), "\n")
#se avessi messo (dataFL = 92) mi restituisce un valore TRUE, corrispondente a 1
#il singolo = assegna un valore agli argomenti
# == verifica un'uguaglianza
Eliminare dal vettore tali misurazioni senza aggiornare dataFL
dataFL[- which(dataFL == 92)]
Creare un nuovo vettore partendo da dataFL e aggiungendo 1
dataFL2 <- dataFL + 1
N <- length(dataFL)
mu1 <- sum(dataFL)/N
mu2 <- sum(dataFL2)/N
sc1 <- dataFL - mu1
sc2 <- dataFL2 - mu2
print("Correlazione tra dataFL e dataFL + 1:")
print( sum(sc1*sc2)/(sqrt(sum(sc1^2)*sum(sc2^2))) )
Calcolare coefficiente di correlazione
r <- sum(scx*scy)/sqrt(sum(scx^2)*sum(scy^2))
Creare un nuovo vettore partendo da dataFL invertendone gli elementi. Calcolare la
correlazione tra i due vettori
as.vector(dataFL)
dataFL = as.vector(dataFL)
dataFL[lenght(dataFL):1]
inv <- dataFL[1:length(dataFL)]
#oppure comando rev(dataFL)
Tracciare l'istogramma dei dati dataFL
hist(dataFL, ylab="Tempo (ms)")
Tracciare un grafico di dispersione dei due vettori al punto 7, rappresentanto i punti con dei
triangoli blu, etichettando gli assi
# apriamo una nuova finestra windows()
plot(dataFL, inv, xlab="dataFL", ylab="Inverted dataFL", pch=2, col="blue")
Salvare i due vettori al punto 7 in un archivio R
save(dataFL, inv, file="test.Rdata")
Lezione6
L’istruzione if ... else permette flussi alternativi di esecuzione, dipendenti dalla valutazione di
una condizione logica Sintassi:
if (condizione)
blocco1
else
blocco2
Semantica: se condizione è vera viene eseguito il blocco1, altrimenti viene eseguito il blocco2,
mai entrambi.
Le istruzioni if..else possono essere innestate cioè blocco 1 e/o blocco 2 possono contenere
altre istruzioni if..else e permettono di ripetere ciclicamente blocchi di istruzioni un numero
prefissato di volte fino a che una determinata condizione logica viene soddisfatta, oppure fino
ad un'istruzione di uscita.
Sono istruzioni la cui struttura sintattica è del tipo:
ciclo {blocco istruzioni}
Sintassi:
for (var in v)
blocco istruzioni
v di solito è il vettore dei valori che var deve assumere
Semantica: gli elementi di v sono assegnati uno alla volta alla variabile var. Il blocco istruzioni
viene valutato una volta per ogni valore che var assume in genere, var compare nelle
istruzioni contenute nel blocco, ma non necessariamente.
function() crea una funzione di comandi in R
Sintassi:
function (argomenti) {corpo_della_funzione}
Argomenti è una sequenza (anche vuota) di ingressi, detti formali, separati da virgole:
(arg1, arg2, ..., argN). Un argomento formale può essere un simbolo o istruzione del tipo
'simbolo = espressione'. Il corpo è un blocco di istruzioni
source() richiama le funzioni, scritte in un file di testo di estensione .R
Scrivere una funzione R stats che ha come input un vettore numerico v,
Esercizio:
rappresentante un campione di una popolazione, e restituisca un vettore contenente la media
campionaria, la deviazione standard, la differenza interquatile, e il numero di valori estremi (0
se assenti). Il vettore deve possedere l'attributo names impostato. Non usare comandi
predefiniti R. Salvare la funzione nel file solEsercitazione6.R
stats <- function(v){
q13 <- quantile(v, probs=c(0.25, 0.75))
diffInt <- q13[2] - q13[1]
numEstr <- sum(v < 1.5*diffInt - q13[1] | v > 1.5*diffInt + q13[2])
res <- c(media, devstd, diffInt, numEstr)
names(res) <- c("media", "deviazione standard",
"differenza interquartile",
"Numero valori estremi")
return(res)
}
Leggere mediante il comando scan il file firefly.txt assegnando il risultato al vettore data.
Quindi chiamare la funzione stats su data, stampando a video il risultato con la funzione
print()
data <- scan("firefly.txt", what=numeric(0))
print(stats(data))
Scrivere una funzione R mult_camp che esegue un campionamento casuale (uniforme)
multiplo dal suo primo argomento (un vettore) v. Il numero di elementi da estrarre (senza
rimpiazzo) è espresso come proporzione della lunghezza di v, indicata dal suo secondo
argomento prop (controllare che prop sia in (0,1] - usare if). Il numero di campionamenti è il
terzo argomento, indicato con nc (valore di default 3). I campioni estratti vanno inseriti in una
matrice di nc righe, restituita all'ambiente chiamante (usare sample e ciclo for). Infine
chiamare la funzione su data, con proporzione 20% e 10 estrazioni
mult_camp <- function(v, prop, nc=3){
if(prop <=0 || prop > 1){
stop("L'argomento prop deve essere compreso tra 0 e 1\n")
}
N <- length(v)
size <- ceiling(N * prop)
# size calcola la taglia del campione
# N ci serve per calcolare la lunghezza del campionamento
# N*prop per essere sicuri di prendere almeno un elemento
res <- matrix(nrow=nc, ncol=size)
for(i in 1:nc){
res[i, ] <- sample(v, size, replace=FALSE)
}
return(res)
} Riprendendo l'esercizio 3 dell'esercitazione odierna, tracciare la distribuzione di
Esercizio 1:
frequenza delle medie dei campioni estratti con la funzione mult_camp, con nc =100
(istogramma). Cosa possiamo dire rispetto alla media di data? Dove si concentra
maggiormente la frequenza? E se impostiamo nc=1000?
# carico le funzioni scritte durante la lezione 6
source("solEsercitazione6.R")
data <- scan("firefly.txt", what=numeric(0))
mcamp <- mult_camp(data, 0.2, 100)
hist(rowMeans(mcamp), xlab="Medie campioni",
main="Istogramma com 100 campioni")
#traccia su un grafico esistente la retta x=v,
#cioè una linea verticale in corrispondenza del valore v
Impostare h=v invece se si vuole una linea
orizzontale (retta y=v)
abline(v = mean(data), col="red", lty=2,lwd=2)
windows()
mcamp <- mult_camp(data, 0.2, 1000)
hist(rowMeans(mcamp), xlab="Medie campioni",
main="Istogramma com 1000 campioni")
abline(v=mean(data), col="red", lty=2,lwd=2)
: Il numero di decessi su strade lo scorso anno è il seguente: Pedoni 1699, Ciclisti
Esercizio 2
280, Motociclisti 650, Automobilisti: 1327. Rappresenta questo insieme di dati in un grafico a
torta a assegnando il colore rosso ai Pedoni e il verde ai Motociclisti
labs <- c("Pedoni", "Ciclisti", "Motociclisti",
"Automobilisti")
valori <- c(1699, 280, 650, 1327)
labs <- paste(labs, valori)
windows()
pie(valori, labs, col=c("red",
"orange", "cyan", "green"))
: Scrivere una funzione che presa in input una matrice M di due colonne, salvi in
Esercizio 3
disp.png e bar.png rispettivamente il diagramma di dispersione delle due colonne e un barplot
contenente entrambe le colonne di M. Nominare gli assi in entrambe le figure. Controllare che
la matrice abbia esattamente 2 colonne
mat_plots <- function(M){
png("disp.png")
nomi <- colnames(M)
# quando il blocco ha una sola istruzione
# e non ho ramo else posso omettere le
# graffe
if(is.null(nomi))# se mancano i nomi colonna
# li inseriamo
nomi <- paste0("Colonna", 1:2)
plot(M[,1], M[,2], xlab = nomi[1],
ylab = nomi[2])
dev.off()
png("bar.png")
colnames(M) <- nomi
barplot(M, beside=T)
dev.off()
}
# prova chiamata
load("dataSP.RData")
mat_plots(dataSP)
Tracciare un diagramma ramo-foglia per la sequenza seq(0.5, 10, length.out=7). Poi rifarlo
impostando l'argomento scale=2. Cosa notate?
stem(seq(0.5, 10, length.out=7))
stem(seq(0.5, 10, length.out=7), scale = 2)
Scrivere una funzione R conta_righe che presa in input una matrice M, calcoli il
Esercizio 4:
numero di valori estremi in ciascuna colonna, e li restituisca all'ambiente chiamante in un
vettore (usare for). Suggerimento: scrivere prima una funzione che riceve un vettore e ne
restituisce il numero di valori estremi, quindi chiamarla all'interno di conta_righe
estremi <- function(vett){
N <- length(vett)
media <- sum(vett)/N
ds <- sqrt(sum((vett - media)^2)/(N - 1))
q13 <- quantile(vett, probs=c(0.25, 0.75))
DI <- q13[2] - q13[1]
NE <- sum(vett < q13[1] - 1.5*DI | vett > q13[2] + 1.5*DI)
return(NE)
}
conta_estremi <- function(M){
N <- ncol(M)
cat("numero colonne:", N, "\n")
if(N > 0){
res <- vector("integer", N)
names(res) <- colnames(M)
# anche per il for se il blocco contiene una sola
# istruzione, le graffe si possono omettere
for(i in 1:N) res[i] <- estremi(M[,i])
return(res)
}else stop("input senza colonne\n")
}
Scrivere una funzione conta_occorrenze, che riceve due vettori, parole e cerca: entrambi
contengono delle stringhe, e la funzione de