swirl - programacion estadistica r
Escriba la lista de marcos de datos para separar archivos CSV con lapply (3)
La pregunta lo dice todo: quiero tomar un objeto de lista lleno de data.frames y escribir cada data.frame en un archivo .csv separado donde el nombre del archivo .csv se corresponda con el nombre del objeto de la lista.
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í está 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
¿Que me estoy perdiendo aqui?
Podrías usar mapply
:
mapply(
write.table,
x=df.daily, file=paste(names(df.daily), "txt", sep="."),
MoreArgs=list(row.names=FALSE, sep=",")
)
Hay un hilo sobre un problema similar en la lista de correo plyr
.
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") escupidos uno por uno, pero los NULL son la evidencia de que el efecto secundario de escribir en los archivos de disco se realizó. (Editar: cambiado [] a [[]].)
Un par de cosas:
laply
realiza operaciones en una lista. Lo que estás buscando es d_ply
. Y no tienes que romperlo durante el día, puedes dejar que plyr
haga eso por ti. Además, no usaría los 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))