2010-07-06 6 views
3

En R, je voudrais créer une boucle qui prend les 3000 premières colonnes de ma trame de données et les écrit dans un fichier, les 3000 colonnes suivantes dans un autre fichier, et ainsi de suite jusqu'à ce que toutes les colonnes aient été divisées en tant que telles. Quelle serait la meilleure façon de faire cela? Je comprends que les fonctions isplit et itérateurs sont maintenant disponibles via CRAN, mais je ne sais pas vraiment comment y arriver. Des suggestions s'il vous plaît?En R, comment créer une boucle pour diviser des colonnes dans une trame de données

Répondre

9

Vous pouvez essayer quelque chose comme:

library(plyr) 
max.col <- ncol(x) 
l_ply(seq(1, max.col, by=3000), function(i) 
    write.table(x[,i:min(i+2999, max.col)], file=paste("i", i, sep="-")) 
) 
+0

Merci Shane pour la réponse de retour! J'ai essayé cela, le résultat est un seul fichier intitulé "i" avec 2456 colonnes - que je suppose est la dernière itération de la boucle? Ma question de suivi est comment puis-je maintenant modifier ce code de telle sorte que je peux donner des noms individuels à chacun des fichiers qui sont sortis? Par exemple "i-1", "i-2", "i-3" Merci beaucoup pour toute votre aide, cela a été très utile! Je suis un débutant absolu avec la programmation/codage. – CCA

+0

Désolé ... mon erreur. Je l'ai mis à jour pour refléter votre convention de nommage de sortie. – Shane

+0

Merci Shane! Un autre suivi rapide - Si je voulais sortir chacun de ces fichiers dans des dossiers spécifiques - disons "i-1" va dans le dossier "A-1", "i-2" va dans le dossier "A-2" dans un ordre séquentiel - - Y a-t-il un moyen de le spécifier dans l'instruction file = paste? Ou devrais-je écrire tous les fichiers dans un dossier et ensuite trouver un moyen de les copier/déplacer dans les dossiers associés après? J'essaie d'éviter cela manuellement, car à la fin il y aura des centaines de tels fichiers. Merci encore une fois pour vos réponses détaillées et rapides - très appréciées! – CCA

1

Je ne sais pas pourquoi vous dérange pas le chargement plyr ... en supposant que votre trame de données est df ... (a volé la réponse de Shane l'utilisation rationnelle de min()

maxCol <- ncol(df) 
for (i in seq(1, maxCol, by 3000)) { 
    write.table(df[,i:min(i+2999, maxCol)], "i") 
} 

Vous pouvez éditer la commande write.table ci-dessus pour l'ajouter dans votre formatage préféré.

+0

'plyr' est inutile dans cet exemple (aurait pu utiliser presque n'importe quelle fonction apply), mais cela vaut la peine de le savoir en général (c'est pourquoi je l'ai utilisé pour la démonstration). Cela dit, les boucles «for» permettent des effets secondaires, donc j'essaie de les éviter à moins que je ne veuille encourager ce qui pourrait entraîner un «mauvais» comportement. – Shane

Questions connexes