2012-02-10 33 views
5

Estoy trabajando en un gran cuestionario y produzco tablas de frecuencia de resumen para diferentes preguntas (por ejemplo, df1 y df2).Unir dos marcos de datos antes de exportarlos como archivos .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) 

normalmente puedo exportar las tramas de datos como archivos CSV con el siguiente comando:

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

Sin embargo, como mi cuestionario tiene muchas preguntas y por lo tanto tramas de datos, me preguntaba si hay una manera en I a combinar diferentes dataframes (digamos con una línea que los separa), y exportarlos a un csv (y finalmente abrirlos en Excel)? Cuando abro Excel, por lo tanto tendré solo un archivo con todos mis marcos de datos de preguntas, uno debajo del otro. Este archivo csv sería mucho más fácil que tener archivos individuales que tengo que abrir para ver los resultados.

Muchas gracias de antemano.

+0

Me gustaría ver 'merge'ing them – James

+0

Si abre una conexión de archivo, puede escribir con write.csv y cat utilizando el parámetro append disponible en ambas funciones. –

Respuesta

4

Si su objetivo final es una hoja de cálculo de Excel, buscaría algunas de las herramientas disponibles en R para escribir directamente un archivo xls. Personalmente, uso el paquete XLConnect, pero también está xlsx y también varias funciones write.xls que flotan en varios paquetes.

resulta que como XLConnect, ya que permite un poco de vectorización útil en situaciones como ésta:

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) 

he especificado header = FALSE ya que de lo contrario se va a escribir el encabezado de columna para cada trama de datos. Pero agregar una sola fila en la parte superior del archivo xls al final no es mucho trabajo adicional.

+0

Eso es increíble @joran - ¡qué gran paquete! Solo unas pocas preguntas rápidas adicionales ... En primer lugar, ¿es posible tener el nombre de la tabla de datos justo encima de la tabla (lo que haría la vida mucho más fácil al hacer coincidir el marco de datos individual con la pregunta de la entrevista). Los nombres de mis marcos de datos se referirán a cada pregunta, es decir, edad, sexo, etc. por lo que esto será muy útil. Además, para fines visuales, ¿es posible poner un borde alrededor de los marcos de datos? –

+0

@KatieT Sí, agregando bordes en posible. Ver '? CreateCellStyle','? SetBorder'. Sin embargo, no será terriblemente conveniente hacerlo programáticamente, ya que tendrá que especificar los bordes correctos en cada celda perimetral individualmente. La forma más fácil de agregar el nombre df sería con una columna separada, como 'c ('Edad', NA, NA, ...)'. – joran

+0

Podría explicar la forma en que funciona la separación entre los marcos de datos cuando se exportan a Excel. Funciona bien en este ejemplo, pero al intentar el mismo código con data.frames más variados, puede hacer que los data.frames se superpongan. He intentado cambiar los números dentro de 'rows <- cumsum (c (1, sapply (dfs, nrow) [- 1] + 1))' pero no he encontrado un método confiable para garantizar un espacio coherente entre data.frames. –

1

Como se comentó James, podría utilizar

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

pero eso sería combinar los datos horizontalmente. Si desea combinar de forma vertical se puede utilizar rbind:

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

(Nota: los nombres de columna deben coincidir para rbind a trabajar).

Cuestiones relacionadas