Modulo III - Introduzione ad R Elisabetta Ronchieri Università di Ferrara Dipartimento di Economia e Management e-mail: elisabetta.ronchieri@unife.it 7 Novembre 2016 Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 1 / 39
Contenuti 1 Operazioni di Ingresso e Uscita 2 Operazioni di ingresso Immissione di dati da linea di comando Operazione di lettura di un file testuale Operazione di lettura di un file compresso 3 Operazioni di uscita 4 Operazioni da/verso memoria di massa 5 Sessione di lavoro Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 2 / 39
Operazioni di ingresso e uscita I dati in R possono essere importati da altri software (come Excel) o digitati direttamente in R da linea di comando se di piccola dimensione. R mette a disposizione funzioni e facility per importare/esportare (leggere/scrivere) dati di diverso formato (quale quello tabellare) da/su file. I dati di grandi dimensioni sono memorizzati in file esterni su memoria di massa e caricati in memoria centrale quando necessario. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 3 / 39
Operazioni di ingresso Di seguito alcune delle funzioni R che supportano la importazione o la lettura di dati da file e la immissione di dati da linea di comando. La funzione scan() permette di leggere e creare oggetti di tipo diverso, riconoscendo il tipo dei valori in modo automatico quando i valori sono interi o reali (negli altri casi bisogna esplicitare il tipo). La funzione read.table() permette di creare un data frame partendo dai valori contenuti in un file di testo. La funzione read.csv() è una variante della funzione read.table(), usata per leggere file generati da programmi come Excel avente la virgola come carattere separatore di default. La funzione read.csv2() è una variante della funzione read.table(), usata per leggere file generati da programmi come Excel avente ; come carattere separatore di default. La funzione source() permette di leggere script R (inversa della funzione dump()). La funzione load() permette di leggere i dati salvati nell area i lavoro. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 4 / 39
Operazioni di uscita Di seguito alcune delle funzioni R che supportano la esportazione o la scrittura di dati su file. La funzione write() permette di memorizzare un oggetto in un file testuale, leggibile successivamente dalla funzione scan() o read.table(). La funzione write.table() permette di scrivere un oggetto di tipo data frame su un file di testo, leggibile dalla funzione read.table(). La funzione write.csv() è una variante della funzione write.table(), usata per scrivere file leggibili da programmi come Excel avente la virgola come carattere separatore di default. La funzione write.csv2() è una variante della funzione write.table(), usata per scrivere file leggibili da programmi come Excel avente ; come carattere separatore di default. La funzione dump() permette di scrivere script R (inversa della funzione source()). La funzione save() permette di scrivere i dati salvati nell area i lavoro. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 5 / 39
Immissione di dati da linea di comando La funzione scan() permette di leggere: insiemi di dati di piccole dimensioni direttamente da linea di comando; ed anche il contenuto di un file. L argomento what= della funzione scan() specifica il tipo di dato che deve essere generato. Quando si usa questa funzione, si immettono dati uno dopo l altro: si preme Invio o Enter per andare su una nuova riga; si preme Ctrl+z o Invio o Enter per terminare e tornare sul prompt >. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 6 / 39
Immissione di dati di tipo numeric Senza argomento what=. > d a t i 1 < scan ( ) 1 : 1 3 4 4 : 5 6 7 7 : Read 6 i t e m s > d a t i 1 [ 1 ] 1 3 4 5 6 7 > mode( d a t i 1 ) [ 1 ] numeric Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 7 / 39
Immissione di dati di tipo character Con argomento what=. Per dati di tipo character mettere what= o what= character(). > d a t i 2< scan ( what=c h a r a c t e r ( ) ) 1 : b l u e r e d 3 : y a l l o w w h i t e 5 : Read 4 i t e m s > d a t i 2 [ 1 ] b l u e r e d y a l l o w w h i t e > mode( d a t i 2 ) [ 1 ] c h a r a c t e r Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 8 / 39
Immissione di dati di tipo misto Con argomento what=. Per dati di tipo misto, come numeric e character, è possibile specificare l oggetto list in what=. > d a t i 3< scan ( what= l i s t ( e t a =0, nome=, cognome= ) ) 1 : 18 Mario R o s s i 2 : 19 G e n t i l e Bianco 3 : Read 2 r e c o r d s > d a t i 3 $ e t a [ 1 ] 18 19 $nome [ 1 ] Mario G e n t i l e $cognome [ 1 ] R o s s i Bianco > mode( d a t i 3 ) [ 1 ] l i s t Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 9 / 39
Operazione di lettura di un file testuale R permette di leggere e scrivere informazioni in forma testuale e mantenerle in appositi file. Questi file possono: provenire da editor di testo, quale Notepad; o da programmi che operano su fogli elettronici, quale Excel; o da programmi ad hoc scritti in linguaggi di alto livello, quale Python; contenere caratteri particolari usati come separatori, quali spazi, virgole, punti e virgole, tabulazioni o CSV (comma separated values). Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 10 / 39
Operazione di lettura di un file testuale con scan() La funzione scan() può leggere i dati anche da file. > d a t i 4 < scan ( scan. t x t, what= l i s t ( e t a =0, nome=, cognome= ) ) Read 2 r e c o r d s > d a t i 4 $ e t a [ 1 ] 18 19 $nome [ 1 ] Mario G e n t i l e $cognome [ 1 ] R o s s i Bianco > mode( d a t i 4 ) [ 1 ] l i s t Il file scan.txt è così fatto: 18 Mario Rossi 19 Gentile Bianco Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 11 / 39
Operazione di lettura di un file testuale con scan() Con argomento what=. Partendo dall esempio di prima, supponiamo di voler leggere solo i nomi e di inserirli in un vettore. > dati5< scan ( scan. txt, what=l i s t ( eta=null, nome=, cognome=null ) ) Read 2 r e c o r d s > w $ e t a NULL $nome [ 1 ] Mario G e n t i l e $cognome NULL > dati5 [ sapply ( dati5, length )>0] $nome [ 1 ] Mario G e n t i l e > i s. v e c t o r ( d a t i 5 ) [ 1 ] TRUE Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 12 / 39
Operazione di lettura di un file testuale con read.table() La funzione read.table() presenta le seguenti caratteristiche: i dati sono letti per riga; i valori mancanti sono indicati da NA (valore esplicito) o da due caratteri di separazione (valore implicito); le stringhe di caratteri nelle righe del file sono convertite in modo automatico, ma se non possibile trasforma il tipo di dato in factor (disattivabile con l argomento as.is=t; di default non mantiene i nomi delle variabili sulla prima riga; il separatore dei dati è lo spazio vuoto; il carattere decimale è il punto. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 13 / 39
Operazione di lettura di un file testuale con read.table() Supponiamo di avere una tabella con 3 righe e 3 colonne in un file testuale tabella1.txt. 120011 Giorgio Valli 120111 Silvia Zani 121111 Elena Vall Il file non contiene nomi di variabili nella prima riga. Il separatore è dato dal carattere spazio bianco. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 14 / 39
Operazione di lettura di un file testuale con read.table() Leggere il file tabella1.txt tramite la funzione read.table(). > d a t i 6 < read. t a b l e ( t a b e l l a 1. t x t ) > d a t i 6 V1 V2 V3 1 120011 G i o r g i o V a l l i 2 120111 S i l v i a Zani 3 121111 E l e n a V a l l La funzione read.table() costruisce un data frame, associando ad ogni colonna una variabile dal nome V x con x che va da 1 a 3, e ad ogni riga un nome y pari a 1, 2 e 3. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 15 / 39
Operazione di lettura di un file testuale con read.table() Supponiamo di avere una tabella con 4 righe e 3 colonne in un file testuale tabella2.txt. Matricola Nome Cognome riga aggiunta 120011 Giorgio Valli 120111 Silvia Zani 121111 Elena Vall Il file contiene nomi di variabili nella prima riga. Il separatore è dato dal carattere spazio bianco. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 16 / 39
Operazione di lettura di un file testuale con read.table() Leggere il file tabella2.txt tramite la funzione read.table(). > d a t i 7 < read. t a b l e ( t a b e l l a 2. t x t, h e a d e r=t) > d a t i 7 M a t r i c o l a Nome Cognome 1 120011 G i o r g i o V a l l i 2 120111 S i l v i a Zani 3 121111 E l e n a V a l l Verificare cosa succede se si setta l argomento header=f. Per cambiare i nomi delle righe usare l argomento row.names=c( st1, st2, st3 ). Per non leggere la prima riga del file usare l argomento skip=1. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 17 / 39
Operazione di lettura di un file testuale con read.csv() La funzione read.csv() presenta le seguenti caratteristiche: di default mantiene i nomi delle variabili sulla prima riga; il separatore dei dati è la virgola; il carattere decimale è il punto. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 18 / 39
Operazione di lettura di un file testuale con read.csv() La funzione read.csv() si aspetta un file nel formato CSV o Comma Separated Values. Ciascuna cella è separata da una virgola e la prima riga contiene i nomi delle colonne. Supponiamo di dover leggere il file dati.csv avente lo stesso contenuto del file tabella2.txt con la virgola come separatore. > d a t i 8 < read. c s v ( d a t i. c s v ) > d a t i 8 M a t r i c o l a Nome Cognome 1 120011 G i o r g i o V a l l i 2 120111 S i l v i a Zani 3 121111 E l e n a V a l l Il contenuto del data frame dati8 è analogo a quello di dati7 ottenuto con la funzione read.table(). Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 19 / 39
Operazione di lettura di un file testuale con read.csv2() La funzione read.csv2() presenta le seguenti caratteristiche: di default mantiene i nomi delle variabili sulla prima riga; il separatore dei dati è il punto e virgola; il carattere decimale è la virgola. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 20 / 39
Operazione di lettura di un file testuale con read.csv2() La funzione read.csv2() si aspetta un file nel formato CSV2 o ; Separated Values. Ciascuna cella è separata da un ; e la prima riga contiene i nomi delle colonne. Supponiamo di dover leggere il file dati.csv2 avente lo stesso contenuto del file tabella2.txt con il ; come separatore. > d a t i 9 < read. c s v ( d a t i. c s v 2 ) > d a t i 9 M a t r i c o l a Nome Cognome 1 120011 G i o r g i o V a l l i 2 120111 S i l v i a Zani 3 121111 E l e n a V a l l Il contenuto del data frame dati9 è analogo a quello di dati8 ottenuto con la funzione read.csv() e di dati7 ottenuto con la funzione read.table(). Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 21 / 39
Operazione di lettura di un file compresso È possibile leggere file compressi in diversi formati, tra i quali zip o gzip, i quali possono contenere file di natura diversa. R mette a disposizione: la funzione unz() per estrarre file da uno zip; la funzione zip() per creare uno zip. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 22 / 39
Operazione di lettura di un file compresso con read.table() Supponiamo di avere il file scuolematerne.zip con all interno: un file mappa delle scuole materne in italia.csv contenente le informazioni sulle scuole materne; un file scuolematerne.r contente le istruzioni R per elaborare il contenuto del file.csv. Per leggere le prime 3 righe del file.csv ed alcune variabili è possibile usare la seguente istruzione: > read. t a b l e ( unz ( s c u o l e m a t e r n e. z i p, + f i l e n a m e= mappa d e l l e s c u o l e materne i n i t a l i a. c s v ), + nrow=3, h e a d e r=t, sep= ; ) [ c ( 3, 6, 1 0 ) ] Comune Nome Regione 1 S i n a l u n g a A s i l o Comunale d i P i e v e d i S i n a l u n g a Toscana 2 Osimo Muzio G a l l o Marche 3 L i v o r n o S a n t e l l i Toscana Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 23 / 39
Operazione di scrittura di un data frame con write.table() La funzione write.table() può esportare su file il contenuto di un data frame. Salvare in un file testuale df.txt un data frame df costruito a partire da una matrice e un vettore. > m < m a t r i x ( 1 : 1 2, nrow =2); v < c ( A, C ) ; > dimnames (m) < l i s t ( rownames (m, do. NULL=FALSE, p r e f i x= row ), + colnames (m, do. NULL = FALSE, p r e f i x = c o l ) ) > m c o l 1 c o l 2 c o l 3 c o l 4 c o l 5 c o l 6 row1 1 3 5 7 9 11 row2 2 4 6 8 10 12 > d f < data. frame (m, c o l 7 =v ) > d f c o l 1 c o l 2 c o l 3 c o l 4 c o l 5 c o l 6 c o l 7 row1 1 3 5 7 9 11 A row2 2 4 6 8 10 12 C > w r i t e. t a b l e ( df, f i l e = d f. t x t ) Nel file df.txt è tale da avere: lo spazio bianco come separatore; le info, row1, row2 gestite come colonna. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 24 / 39
Importare dati in un data frame con read.table() Affinchè la funzione read.table() inserisca il contenuto di un file direttamente in un data frame, il file deve essere memorizzato nel modo seguente: la prima riga del file deve avere un nome per ciascuna variabile del data frame; le righe successive del file memorizzano le osservazioni che saranno memorizzate nel data frame; ciascuna di queste righe pu øavere come primo valore l etichetta di riga (che sarà memorizzata in row.names= del data frame); ciascun valore sulla riga è separato da un blank (spazio, tabulazione, etc), ma possono essere inseriti altri separatori. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 25 / 39
Importare dati in un data frame con read.table() Leggere il contenuto del file df.txt tramite la funzione read.table(). > read. t a b l e ( f i l e = d f. t x t ) c o l 1 c o l 2 c o l 3 c o l 4 c o l 5 c o l 6 c o l 7 row1 1 3 5 7 9 11 A row2 2 4 6 8 10 12 C Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 26 / 39
Importare ed esportare un data frame Ricreare il file df.txt con la funzione write.table() usando i seguenti parametri: row.names=f sep=, col.names=f Indicare quale argomento della funzione read.table() da usare per interpretare correttamente la virgola come separatore. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 27 / 39
Operazione di scrittura di un data frame su formato CSV Ricreare il data frame df come visto prima e salvarlo in un file df.csv. Usare la funzione write.csv(). Ricreare il data frame df come visto prima e salvarlo in un file df.csv avente ; come carattere separatore. Usare la funzione write.csv2(). Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 28 / 39
Operazioni da/verso memoria di massa Esaminiamo alcune funzioni che permettono di salvare in memoria di massa oggetti di interesse per poterli richiamare in memoria centrale successivamente. La funzione save() consente di salvare oggetti di tipo diverso in uno stesso file binario (non cancella gli oggetti dalla memoria centrale o dalla sessione di lavoro), recuperabile con la funzione load(). La funzione dump() genera un file testuale contenente le istruzioni R che possono essere eseguite con la funzione source(). Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 29 / 39
Operazioni da/verso memoria di massa > x < 1 > y < data. frame ( a=1, b= a ) > save ( x, y, f i l e = data. RData ) > x< 2 > load ( data. RData ) > x [ 1 ] 1 > y a b 1 1 a L argomento file= della funzione save() è obbligatorio e contiene il nome del file. La funzione load() sovrascrive gli oggetti x e y esistenti. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 30 / 39
Operazioni da/verso memoria di massa > x < 1 > y < data. frame ( a=1, b= a ) > dump( c ( x, y ), f i l e = data. R ) > rm( x, y ) > source ( data. R ) > x [ 1 ] 1 > y a b 1 1 a Nella funzione dump(): il primo argomento è una lista di variabili; l argomento file= contiene il nome del file dove salvare le istruzioni. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 31 / 39
Sessione di lavoro Gli oggetti in R sono mantenuti nella memoria centrale e disponibili nella sola sessione di lavoro. Per evitare che i dati vengano persi, vi sono delle funzioni e strumenti che permettono di memorizzare gli oggetti in memoria di massa. È possibile quindi fotografare lo stato della sessione di lavoro (o elaborazione compiuta fino ad un certo istante) nella directory corrente di lavoro. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 32 / 39
Directory corrente Per settare la directory corrente è possibile: usare da console il comando > setwd ( E : /R/1/ s c r i p t s ) o dal menu della console cliccare su File Change Dir. Per sapere quale è la directory corrente è possibile usare da console il comando getwd(). Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 33 / 39
Directory corrente Per sapere il contenuto della directory corrente è possibile usare da console il comando dir(). La stessa funzione permette tra le altre cose: di esaminare il contenuto di una sotto directory della directory corrente: > d i r ( path=. /memoria d i massa ) [ 1 ] data. R data. RData di ottenere i file con una certa estensione: > d i r ( path=. /memoria d i massa, p a t t e r n=. RData ) [ 1 ] data. RData Come cambia il valore in pattern= per i file di estensione.txt? > d i r ( path=. /memoria d i massa, p a t t e r n=. t x t ) Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 34 / 39
Come salvare la sessione di lavoro Il modo più semplice per salvare la sessione di lavoro è tramite il comando q() a chiusura della stessa, rispondendo in modo affermativo alla domanda Save workspace image?. Rispondendo Yes alla domanda sono generati due file nella directory corrente: 1 file con estensione.rdata contenente l immagine binaria dell insieme degli oggetti usati; 2 file con estensione.rhistory contenente l insieme dei comandi usati da console. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 35 / 39
Come salvare la sessione di lavoro Per salvare l immagine binaria in un file.rdata è possibile: usare da console il comando save.image(); o dal menu della console cliccare su File Save Workspace. Per salvare la storia dei comandi in un file.rhistory è possibile: usare da console il comando savehistory(); o dal menu della console cliccare su File Save History. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 36 / 39
Come recuperare la precedente sessione di lavoro Per recuperare l immagine binaria è possibile: fare doppio click sul file.rdata; o usare da console il comando load( file.rdata ) o dal menu della console cliccare su File Change Dir e su File Load Workspace. Per recuperare la storia dei comandi è possibile: fare doppio click sul file.rhistory; o usare da console il comando source( file.rhistory ) o dal menu della console cliccare su File Change Dir e su File Load History. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 37 / 39
Esercizi 1 Costruire un data frame df1 di 10 righe con 4 variabili di cui 1 numerica e 3 a caratteri. Memorizzare su file il data frame e quindi leggere la sola variabile numerica, assegnandolo al vettore v. 2 Costruire un data frame df1 di 10 righe con 4 variabili di cui 1 numerica e 3 a caratteri. Memorizzare su file il data frame e quindi leggere le tre variabili carattere, assegnandolo al vettore df2. 3 Costruire un data frame df1 di 10 righe con 4 variabili di cui 3 numeriche e 1 a caratteri. Memorizzare su file il data frame e quindi leggerlo, assegnandolo alla variabile df2. 4 Costruire una matrice numerica con 3 righe e 4 colonne. Scriverla su file tramite la funzione write(). Ricaricare quindi la matrice in memoria. 5 Scrivere su file il data frame df1 dell es. 1 separando gli elementi con virgole, ed omettendo il nome delle variabili. 6 Scrivere su file il data frame df1 dell es. 1 separando gli elementi con il punto e virgola, ed omettendo il nome delle variabili. Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 38 / 39
Documentazione Per ciascuna funzione visionare l help online di R. Vito M.R. Muggeo e Giancarlo Ferrara, Il Linguaggio R: concetti introduttivi ed esempi, II Edizione, 2005, Cap. 1.2, 2.1, ftp://cran.r-project.org/pub/r/doc/contrib/nozionir.pdf W.N. Venables, D. M. Smith and the R Development Core Team, An introduction to R, 2016, Cap. 7, https://cran.r-project.org/doc/manuals/r-intro.pdf Quick-R, Exporting Data, http://statmethods.net/input/exportingdata.html Quick-R, Importing Data, http://statmethods.net/input/importingdata.html Elisabetta Ronchieri Modulo III.1 - Operazioni di Ingresso/Uscita 7 Novembre 2016 39 / 39