2010-11-17 5 views
24

La question dit tout - je veux prendre un objet liste complète de data.frames et écrire chaque data.frame dans un fichier .csv séparé où le nom de la Le fichier .csv correspond au nom de l'objet liste.Écrit la liste de data.frames pour séparer les fichiers CSV avec lapply

Voici un exemple reproductible et le code que j'ai écrit jusqu'ici.

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 = ",")}) 

Et voici le haut du message d'erreur R recrache

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'est-ce que je manque ici?

+0

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

+0

@Joshua - dar, la recherche Google échoue. Je devrais rentrer à la maison maintenant. N'hésitez pas à fermer celui-ci. – Chase

+0

Ce n'est pas exactement un doublon. Votre erreur indique que vous passez plus d'une chaîne à write.table en tant que nom de fichier. names (x) renvoie tous les colnames d'une trame de données. –

Répondre

16

Essayez ceci:

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

Vous devriez voir les noms ("1", "2", "3") cracher un par un, mais les valeurs NULL sont la preuve que le côté -effect de l'écriture sur les fichiers du disque a été fait. (Edit: changé [] pour [[]].)

+0

Merci pour la solution de base R et la façon plus succincte d'utiliser 'coller' . – Chase

+0

Je pense qu'il devrait y avoir 'df.daily [[x]]'. – Marek

+0

Les deux fichiers df.daily [x] et df.daily [[x]] donnent le même résultat sur ma machine. Je suppose que je peux voir la logique de votre soupçon, cependant. –

5

Quelques choses:

laply effectue des opérations sur une liste. Ce que vous cherchez est d_ply. Et vous ne devez pas le casser par jour, vous pouvez laisser plyr le faire pour vous. De plus, je n'utiliserais pas de noms (x) car cela retourne tous les noms de colonnes d'un data.frame.

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

J'oublie toujours les fonctions "_" pour une raison quelconque. Ça fera l'affaire. Merci! – Chase

+0

cette solution ne fonctionne pas pour moi. Je reçois un message d'erreur comme suit: Erreur dans le fichier (fichier, ifelse (ajouter, "a", "w")): argument "description" non valide En outre: Message d'avertissement: In if (file == "") file <- stdout() else if (est.caracter (fichier)) {: la condition a une longueur> 1 et seul le premier élément sera utilisé – zach