2010-11-17 10 views
24

La pregunta lo dice todo: quiero tomar un objeto list lleno de data.frames y escribir cada data.frame en un archivo .csv separado donde el nombre del El archivo .csv corresponde al nombre del objeto de la lista.Escribir lista de data.frames para separar archivos CSV con lapply

Aquí hay un ejemplo reproducible y el código que he escrito hasta ahora.

df <- data.frame(
    var1 = sample(1:10, 6, replace = TRUE) 
    , var2 = sample(LETTERS[1:2], 6, replace = TRUE) 
    , theday = c(1,1,2,2,3,3) 
) 

df.daily <- split(df, df$theday) #Split into separate days 

lapply(df.daily, function(x){write.table(x, file = paste(names(x), ".csv", sep = ""), row.names = FALSE, sep = ",")}) 

Y aquí es la parte superior del mensaje de error que R escupe

Error: Results must have one or more dimensions. 
In addition: Warning messages: 
1: In if (file == "") file <- stdout() else if (is.character(file)) { : 
    the condition has length > 1 and only the first element will be used 

Qué me estoy perdiendo aquí?

+0

Duplicado de http://stackoverflow.com/q/3411429/271616 –

+0

@Joshua - dar, Google search fail. Debería irme a casa ahora. Siéntase libre de cerrar este. – Chase

+0

No es exactamente un duplicado. Su error indica que está pasando más de una cadena a write.table como nombre de archivo. names (x) devuelve todos los colnames de un marco de datos. –

Respuesta

16

Prueba esto:

sapply(names(df.daily), 
function (x) write.table(df.daily[[x]], file=paste(x, "txt", sep=".")) ) 

debería ver los nombres ("1", "2", "3") escupir uno por uno, pero los nulos son la evidencia de que la parte El efecto de escribir en los archivos del disco estaba hecho. (Edit: se ha cambiado [] a [[]].)

+0

Gracias por la solución de base R y la manera más sucinta de usar 'pegar' . – Chase

+0

Creo que debería haber 'df.daily [[x]]'. – Marek

+0

Ambos df.daily [x] y df.daily [[x]] dan el mismo resultado en mi máquina. Aunque creo que puedo ver la lógica de tu sospecha. –

5

Un par de cosas:

laply lleva a cabo operaciones en una lista. Lo que estás buscando es d_ply. Y no tiene que dividirlo durante el día, puede dejar que plyr lo haga por usted. Además, no usaría nombres (x) ya que devuelve todos los nombres de columna de un data.frame.

d_ply(df, .(theday), function(x) write.csv(x, file=paste(x$theday,".csv",sep=""),row.names=F)) 
+0

Siempre me olvido de las "_" funciones plyr por alguna razón. Esto hará el truco. ¡Gracias! – Chase

+0

esta solución no funciona; t funciona para mí. Recibo un mensaje de error de la siguiente manera: Error en el archivo (archivo, ifelse (adjuntar, "a", "w")): argumento 'descripción' no válido Además: Mensaje de advertencia: En if (archivo == "") file <- stdout() else if (is.character (file)) {: la condición tiene una longitud> 1 y solo se usará el primer elemento – zach

Cuestiones relacionadas