Archivio tag: Excel

Videotutorial: importare dati in R da Excel

Vista la rilevanza del post di qualche settimana fa relativo al data input da SPSS e Excel, abbiamo realizzato un piccolo videotutorial sull’argomento. È il primo tutorial in versione “video” del blog e speriamo in futuro di poterne realizzare molti altri, cercando di migliorarci passo dopo passo.

Nel tutorial si fa uso dell’editor Notepad++, strumento molto utile quando si lavora con R in ambiente Windows, che, fra le altre cose, riconosce automaticamente la sintassi R colorando in maniera diversificata i comandi.

Di seguito si possono scaricare i due file di esempio e si riporta la sintassi R mostrata nel video.

AirQuality.xlsx Questionario BFI.xlsx

getwd()

bfi <- read.csv2("Questionario BFI.csv", na.strings=999) View(bfi) str(bfi) airq <- read.csv2("AirQuality.csv") View(airq) str(airq) [/code]

Diversamente da quanto visto nel post di Antonello Preti, nel tutorial non si fa riferimento alla funzione file.choose, ma si utilizza il cambio di directory da menù. Se si vuole evitare il cambio di directory e utilizzare la funzione file.choose, il precedente codice potrà essere sostituito dal seguente.


bfiPath <- file.choose() bfi <- read.csv2(bfiPath, na.strings=999) View(bfi) str(bfi) airqPath <- file.choose() airq <- read.csv2(airqPath) View(airq) str(airq) [/code]

Esportare dati da R a Excel

Nel precedente post, Antonello Preti ci ha spiegato i principali metodi che si utilizzano per importare dati da SPSS o Excel in R. Già in passato avevamo affrontato l’argomento parlando della libreria XLConnect, ma i metodi proposti da Antonello sono certamente più immediati e universali. Dico “universali” perché le funzioni proposte, ovvero read.table, read.csv e read.csv2 si appoggiano a file in formato testuale che possono essere aperti da qualsiasi applicativo dedicato, che sia Office, OpenOffice, LibreOffice o altri.

CSV file

Quando si lavora con R bisogna mettersi in testa che il formato di riferimento non è più né XLS né ODS, ma quello testuale: .txt, .csv, .dat… l’importante è che il file contenga solo ed esclusivamente testo. Bisogna considerare, comunque, che universalmente il formato riconosciuto per i dati è il CSV, acronimo di “Comma-Separated Values”, ed è il formato che io sempre consiglio, sia perché l’estensione .csv indica inconfondibilmente un file contenente dati (mentre .txt può contenere qualsiasi tipo di testo) sia perché è automaticamente riconosciuto dai principali applicativi di tipo “spreadsheet” come Excel.

Le funzioni per esportare tabelle di dati da R a file di tipo testuale sono write.table, write.csv e write.csv2. La funzione write.table è quella generica che va bene per qualsiasi tipo di file, mentre le altre due sono specifiche per salvare file in formato CSV.

Partiamo da write.table. Non starò qui a elencare tutti i dettagli ma mi limiterò a parlare delle opzioni principali che è importante conoscere. Il comando funziona così:

write.table(x, file="mydata.txt", quote=T, sep=" ", dec=".", na="NA", row.names=T, col.names=T)

L’argomento x è l’oggetto R che contiene il dataset, mentre file è una stringa di carattere che contiene il nome (con l’estensione) che dovrà avere il file da creare. Da notare che io in questo esempio ho utilizzato l’estensione .txt, ma nessuno mi avrebbe impedito di utilizzare altri formati. L’argomento quote specifica se, nel file, le stringhe di carattere – che siano nomi di colonna oppure valori contenuti nel dataset – dovranno essere scritti tra doppi apici.

Veniamo ora alla parte calda, ovvero gli argomenti sep e dec. Il primo indica quale sarà il separatore di campo, ovvero quel carattere che dovrà essere interposto tra un dato e l’altro all’interno di una stessa riga. Invece, dec specifica quale dovrà essere il separatore decimale (normalmente o il punto oppure la virgola).

Altra cosa da non trascurare è l’argomento na, che indica quale dovrà essere il carattere che codifica i valori mancanti. Io di solito amo lasciare le celle vuote, per cui specifico na="", ma altri preferiscono usare sequenze di numeri come na="999".

Gli ultimi due argomenti specificano se nel file dovranno essere inseriti anche i nomi di riga (row.names) e di colonna (col.names); se T (TRUE), questi saranno salvati, altrimenti se non li si vuole salvare si specificherà F (FALSE).

Veniamo ora a un esempio. Immaginiamo di avere un oggetto R di tipo “data frame” (ovvero una tabella di dati) chiamato dataset che vogliamo esportare in Excel. Come abbiamo visto, piuttosto che esportarlo direttamente in Excel è più comodo salvarlo in un file CSV che poi Excel potrà leggere molto agevolmente. Per eseguire questa operazione possiamo usare proprio write.table:

write.table(dataset, file="dataset.csv", quote=F, sep=";", dec=",", na="", row.names=T, col.names=T)

Io non ho voluto incapsulare le stringhe fra apici (quote=F) e ho preferito lasciare le celle vuote dove sono presenti dei dati mancanti (na=""); non ho voluto i nomi di riga (row.names=F) ma ho tenuto quelli di colonna (col.names=T), che saranno poi fondamentali per indentificare le variabili. Da notare che, per ottenere un vero e proprio file CSV, ho dovuto specificare il punto e virgola come separatore di campo e la virgola come separatore decimale.

Dato che volevo un file CSV, avrei potuto utilizzare direttamente l’apposita funzione:

write.csv2(dataset, file="dataset.csv", quote=F, na="", row.names=T, col.names=T)

Come si vede, non c’è molta differenza con write.table; fondamentalmente, read.csv e read.csv2 hanno dei valori predefiniti per gli argomenti sep e dec già pensati per l’estensione .csv, cosa che rende più rapido scrivere l’istruzione. Inoltre, bisogna notare che l’argomento col.names è in tutti i casi TRUE già di default, quindi può essere omesso.

La morale della favola è che, come per importare i dati, anche per esportarli dobbiamo appoggiarci al formato CSV; R mette a disposizione queste due funzioni, read.csv2 e write.csv2 che rendono il lavoro più agevole.

Infine, una considerazione personale. Il CSV è il formato più usato per condividere dati perché è un formato aperto che può essere letto attraverso qualsiasi dispositivo di gestione e analisi dati. Spesso diamo così per scontato l’uso di Excel o SPSS da dimenticarci che, in realtà, moltissime persone non usano questi software – spesso manco li hanno – ma si avvalgono di altri sistemi, come appunto OpenOffice e LibreOffice. Il formato XLS non è universale, il CSV sì. Abituiamoci a usarlo.

ApRire un file SPSS oppure Excel in R

R è un sistema potente per l’analisi statistica e per la rappresentazione grafica. Tuttavia, non è esattamente user-friendly per l’archiviazione dei dati. Per un bel po’ ancora i vostri dati saranno archiviati in Excel o in SPSS o simili.

Da SPSS a R

Come aprire in R un file archiviato in altro sistema? Ci sono librerie (packages) come foreign che consentono di effettuare l’operazione. La libreria foreign è già installata nella distribuzione base del sistema: è sufficiente attivarla con la funzione library.

> library(foreign)

A questo punto potete aprire il vostro file, se sapete dove si trova…

Il metodo più semplice per localizzare un file (lo so, lo so, settare la directory, ma io sono uno di modi spicci) è digitare:

> file.choose()

Si aprirà una finestra come quella di Windows per l’accesso ai file, cercate il vostro file nelle cartella dove lo avete archiviato, e via. R vi restituisce la path, cioè il percorso:

> "C:\\Users\\Antonio\\Desktop\\Traferire in MAC\\InsulaR\\DatabaseEsempio.sav"

A questo punto potete dare il comando di lettura file in SPSS da foreign, specificando la path che conduce al file (sì, avete capito, copia e incolla tra virgolette):

dataset = read.spss("C:\\Users\\Antonio\\Desktop\\Traferire in MAC\\InsulaR\\DatabaseEsempio.sav", to.data.frame=TRUE)

Volete risparmiarvi il copia e incolla? Assegnate l’operazione file.choose() a un oggetto, chiamiamolo db (abbreviazione per database):

> db = file.choose()

Come prima, avete ottenuto il percorso al file, solo che questa volta il sistema non ve lo visualizza perché voi l’avete assegnato all’oggetto db. Quindi, ora l’oggetto db contiene una stringa di caratteri che indentifica il percorso che R dovrà seguire per recuperare il file.

Pronti via?

dataset = read.spss(db, to.data.frame=TRUE)

Il comando read.spss() legge il dataset in formato sav; bisogna stare attenti però a specificare come TRUE l’argomento to.data.frame, il quale richiede alla funzione di disporre i dati all’interno di un data frame (ovvero una tabella di dati).

Yolo, man. Un altro metodo molto semplice di aprire un file SPSS in R è salvare il file in un formato che R gestisce molto bene: il .dat (delimitato da tabulazione). Salvate il vostro file SPSS in .dat e operate come prima, andando alla ricerca del file con la funzione file.choose() e assegnando la stringa risultante a un oggetto.

La funzione per leggere il file stavolta è read.table(). Prestate molta attenzione ai dati mancanti: se ce ne sono, bisogna dire a R quale codice li identifica (es. 99), specificando un valore per l’argomento na.strings.

Avete il vostro file in .dat?

db = file.choose()
dataset = read.table(db, header = TRUE)

l’argomento header = TRUE serve per specificare che la prima riga del file contiene i nomi delle variabili per cui questi valori non sono da interpretare come dati.

Da Excel a R

Per importare in R un file da Excel ci sono molti metodi diversi e purtroppo nessuno è esente da problemi. Uno l’abbiamo già visto in questo post, ma ce ne sono di più semplici. Il metodo più immediato richiede due passaggi: 1) esportare il foglio di dati Excel in file formato testuale, 2) leggere il nuovo file attraverso le funzioni R. Per la verità, questo metodo è valido non solo per il programma Excel di Microsoft ma anche per l’applicativo Calc di LibreOffice/OpenOffice

Per prima cosa, utilizzando il menù di Excel, si deve salvare il file in formato csv. Excel fornisce diverse opzioni: CSV (delimitato da separatore di elenco), CSV (Macintosh) e CSV (MS-DOS). Nella pratica, un’opzione vale l’altra.

Il risultato sarà un file testuale che contiene tante righe quante erano le righe dell’originale Excel, con i dati separati da un punto e virgola all’interno di ogni riga. La virgola, invece, viene utilizzata come separatore decimale. Questo formato è quello che R chiama csv2, che è lo standard più utilizzato nell’Europa mediterranea. Il resto del mondo, invece, utilizza non il punto e virgola ma la virgola come separatore di campo e il punto come separatore decimale. Utilizzare il csv è molto comodo, non solo perché Excel lo riconosce e lo apre automaticamente ma anche perché è il formato standard con il quale vengono condivisi il dati.

Una volta esportato il file in csv, lo potete importare in R utilizzando i comandi:

db = file.choose()
dataset = read.csv2(db)

Nel lanciare read.csv2(), bisogna prendere alcune precauzioni. Prima di tutto, per default la funzione assume che la prima riga contiene i nomi che dovranno essere assegnati alle colonne (header = TRUE). Se invece la prima riga non contiene le etichette da utilizzare come nomi di colonna, bisognerà specificare header = FALSE. In secondo luogo, possiamo anche indicare alla funzione qual è il codice usato per codificare i dati mancanti; useremo na.strings = "" se le celle vuote corrispondono a dati mancanti, ma potremo anche utilizzare altri valori come ad esempio na.strings = 99.

Se il separatore di campo del file csv non è il punto e virgola ma la virgola e il separatore decimale è il punto, il comando da usare sarà read.csv(). Da notare che le due funzioni read.csv() e read.csv2() altro non sono che dei casi specifici di read.table() e, a dirla tutta, si potrebbe anche usare la stessa funzione read.table() per leggere un file csv:

dataset = read.table(db, sep=";", dec=",", header=TRUE)

Verificare che la lettura sia andata a buon fine

Una volta importato un file, è sempre bene fare dei controlli per verificare che la lettura sia andata a buon fine.

Per controllare le dimensioni del vostro database, usate la funzione dim. Vi restituirà due numeri, il primo si riferisce ai casi (le righe del vostro database), mentre il secondo numero è quello delle variabili (le colonne del vostro database). Facciamo un esempio con un database che avete chiamato MieiDati:

> dim(MieiDati)

Inoltre, può essere utile visualizzare un’anteprima dei dati. Per ispezionare le prime 6 righe del vostro database, usate la funzione head:

> head(MieiDati)

Per ispezionare le ultime 6 righe del vostro database, usate la funzione tail:

> tail(MieiDati)

Per ispezionare la struttura del database, usate la funzione str:

> str(MieiDati)

Volete visualizzare tutta la matrice di dati? Se la tabella di dati è grossa, vi conviene usare la funzione View, oppure fix che vi consentirà anche di modificare manualmente il contenuto delle celle:

> View(MieiDati)
> fix(MieiDati)

Antonello Preti

XLConnect: una libreria R per interagire con Excel

Microsoft Excel è uno dei più noti applicativi utilizzati per l’archiviazione dei dati (ma le sue potenzialità vanno ben oltre). Excel è indubbiamente molto comodo per organizzare un dataset, anche se alternative altrettanto buone ma gratuite sono disponibili sul mercato, come LibreOffice e OpenOffice.

Uno dei punti deboli di R è sempre stata la sua difficoltà nell’importare ed esportare dati da e per Excel. Negli ultimi anni, però, una società svizzera – la Mirai Solutions GmbH – ha sviluppato XLConnect, una libreria che permette di eseguire queste operazioni abbastanza agevolmente. In rete si trova anche un dettagliato manuale che descrive come utilizzare le funzioni messe a disposizione dal package.

Il comando che genera con connessione tra R e un file Excel è loadWorkbook, che richiede di specificare il nome del file da leggere. Ovviamente, la cartella di lavoro di R deve essere la stessa che contiene il file.

library(XLConnect)
wb <- loadWorkbook("myfile.xlsx")
&#91;/code&#93;

<p style="text-align: justify;">Un file Excel potrebbe contenere più fogli di lavoro. Quindi, stabilita la connessione, potremmo chiederci quali sono i fogli contenuti nel file:</p>
[code language="r"]
getSheets(wb)

Ispezionati i fogli di lavoro e identificato quello che contiene il dataset da importare, possiamo leggere i dati in blocco e riversare il contenuto del foglio in un oggetto R:

df <- readWorksheet(wb, sheet="Foglio1", header=T)
&#91;/code&#93;
<p style="text-align: justify;">Dove <i>wb</i> è l'oggetto che contiene le specifiche della connessione stabilita, <i>sheet</i> è il nome del foglio di lavoro da leggere e <i>header</i> specifica se la prima riga del dataset contiene i nomi da attribuire alle colonne. Potrebbero essere specificati anche altri argomenti, come <i>startRow</i> e <i>startCol</i>, che indicano le coordinate della cella da cui far partire la lettura.</p>

<p style="text-align: justify;">Se invece vogliamo esportare in un file Excel un dataset contenuto in un oggetto R, dobbiamo prima di tutto decidere se creare un nuovo file oppure se utilizzare un file già esistente, creando o un nuovo foglio di lavoro oppure scrivendo in un foglio già presente nel file.</p>

<p style="text-align: justify;">Se si vuole esportare un dataset generando un nuovo file, nel creare una connessione con Excel bisogna impostare a TRUE l'argomento <i>create</i> (il quale, se invece è impostato a FALSE, prevede la scrittura su un file preesistente). Per default, <i>create</i> è definito come FALSE.</p>

<p style="text-align: justify;">Prendiamo il caso in cui si debba generare un nuovo file.</p>
[code language="r"]
wb <- loadWorkbook("myfile.xlsx", create=T)
&#91;/code&#93;

<p style="text-align: justify;">Stabilita la connessione, utilizzando la funzione <b>createSheet</b> dobbiamo generare un foglio di lavoro su cui scrivere i dati:</p>

[code language="r"]
createSheet(wb, name="Nuovi Dati")

A questo punto, utilizzando la funzione writeWorksheet, possiamo scrivere i dati sul nuovo file. Tale funzione richiede come primo argomento l'oggetto wb, come secondo argomento il data frame che contiene i dati, e infine il nome del foglio di lavoro su cui scrivere.

writeWorksheet(wb, df, sheet="Nuovi Dati")
saveWorkbook(wb)

È fondamentale l'uso della funzione saveWorkbook, che effettivamente genera il file. Senza di questa, nessn documento Excel verrebbe creato.