2012-02-10 42 views
5

Sto lavorando su un questionario di grandi dimensioni e produco tabelle di frequenza di riepilogo per domande diverse (ad esempio df1 e df2).Unire due dataframe prima dell'esportazione come file .csv

a<-c(1:5) 
b<-c(4,3,2,1,1) 
Percent<-c(40,30,20,10,10) 
df1<-data.frame(a,b,Percent) 
c<-c(1,1,5,2,1) 
Percent<-c(10,10,50,20,10) 
df2<-data.frame(a,c,Percent) 
rm(a,b,c,Percent) 

Io di solito esportare i dataframes come file CSV utilizzando il seguente comando:

write.csv(df1 ,file="df2.csv") 

Tuttavia, come il mio questionario ha molte domande e quindi dataframes, mi chiedevo se c'è un modo in R combinare diversi dataframes (ad esempio con una linea che li separa) ed esportarli in un csv (e quindi aprirli definitivamente in Excel)? Quando apro Excel, avrò quindi un solo file con tutti i miei frame di dati delle domande, uno sotto l'altro. Questo file CSV sarebbe molto più semplice che avere singoli file che devo aprire a turno per visualizzare i risultati.

Molte grazie in anticipo.

+0

Guarderei unire loro – James

+0

Se si apre una connessione file, è possibile scrivere con write.csv e cat utilizzando il parametro append disponibile in entrambe le funzioni. –

risposta

4

Se il tuo obiettivo finale è un foglio di calcolo di Excel, esaminerei alcuni degli strumenti disponibili in R per scrivere direttamente un file xls. Personalmente, io uso il pacchetto XLConnect, ma c'è anche lo xlsx e anche diverse funzioni write.xls che fluttuano in vari pacchetti.

Mi capita di come XLConnect perché permette per qualche vettorizzazione utile in situazioni come questa:

require(XLConnect) 

#Put your data frames in a single list 
# I added two more copies for illustration 
dfs <- list(df1,df2,df1,df2) 

#Create the xls file and a sheet 
# Note that XLConnect doesn't seem to do tilde expansion! 
wb <- loadWorkbook("/Users/jorane/Desktop/so.xls",create = TRUE) 
createSheet(wb,"Survey") 

#Starting row for each data frame 
# Note the +1 to get a gap between each 
n <- length(dfs) 
rows <- cumsum(c(1,sapply(dfs[1:(n-1)],nrow) + 1)) 

#Write the file 
writeWorksheet(wb,dfs,"Survey",startRow = rows,startCol = 1,header = FALSE) 
#If you don't call saveWorkbook, nothing will happen 
saveWorkbook(wb) 

ho specificato header = FALSE perché altrimenti scriverà l'intestazione colonna per ciascun frame di dati. Ma aggiungere una singola riga nella parte superiore del file xls alla fine non è molto più lavoro.

+0

È fantastico @joran: che bel pacchetto! Solo alcune brevi domande aggiuntive ... In primo luogo, è possibile avere il nome del dataframe appena sopra la tabella (il che renderebbe la vita molto più semplice facendo corrispondere il singolo dataframe alla domanda dell'intervista). I nomi dei miei dataframe faranno riferimento a ciascuna domanda - cioè età, sesso ecc. Quindi questo sarà molto utile. Inoltre, per scopi visuali, è possibile mettere un bordo attorno ai dataframes? –

+0

@KatieT Sì, l'aggiunta di bordi è possibile. Vedi '? CreateCellStyle','? SetBorder'. Tuttavia, non sarà terribilmente conveniente farlo a livello di codice, poiché dovrai specificare i bordi corretti su ciascuna cella perimetrale individualmente. Il modo più semplice per aggiungere il nome df sarebbe con una colonna separata, come 'c ('Età', NA, NA, ...)'. – joran

+0

Puoi spiegare il modo in cui funziona la separazione tra i data.frames quando esportati in Excel. Funziona bene in questo esempio, ma quando si prova lo stesso codice con più data.frames può causare il sovrapporsi di data.frames. Ho provato a cambiare i numeri all'interno di "rows <- cumsum (c (1, sapply (dfs, nrow) [- 1] + 1))" ma non ho trovato un metodo affidabile per garantire uno spazio coerente tra data.frames. –

1

Come James ha commentato, è possibile utilizzare

merge(df1, df2, by="a") 

ma che sarebbe combinare i dati in senso orizzontale. Se si desidera combinare verticalmente è possibile utilizzare rbind:

rbind(df1, df2, df3,...) 

(Nota: i nomi delle colonne devono corrispondere per rbind al lavoro).