J'ai quelques très gros fichiers de données délimités et je veux traiter uniquement certaines colonnes dans R sans prendre le temps et la mémoire pour créer un data.frame
pour l'ensemble du fichier.
Les seules options que je connais sont read.table
ce qui est très inutile quand je ne veux que quelques colonnes ou scan
qui semble trop bas pour ce que je veux.
Existe-t-il une meilleure option, soit avec R pur, soit en appelant peut-être un autre script Shell pour effectuer l'extraction des colonnes, puis en utilisant scan ou read.table sur sa sortie? (Ce qui conduit à la question de savoir comment appeler un script Shell et capturer sa sortie dans R?).
Parfois, je fais quelque chose comme ça quand j'ai les données dans un fichier délimité par des tabulations:
df <- read.table(pipe("cut -f1,5,28 myFile.txt"))
Cela permet à cut
de faire la sélection des données, ce qu'il peut faire sans utiliser beaucoup de mémoire.
Voir Lire uniquement un nombre limité de colonnes pour la version R pure, en utilisant "NULL"
dans l'argument colClasses
à read.table
.
Une possibilité consiste à utiliser pipe()
à la place du nom de fichier et que awk
ou des filtres similaires extraient uniquement les colonnes de votre choix.
Voir help(connection)
pour en savoir plus sur pipe
et ses amis.
Edit: read.table()
peut également le faire pour vous si vous êtes très explicite sur colClasses - une valeur NULL pour une colonne donnée saute la colonne ensemble. Voir help(read.table)
. Nous avons donc là une solution en base R sans packages ni outils supplémentaires.
Je pense que l'approche de Dirk est simple et rapide. Une alternative que j'ai utilisée consiste à charger les données dans sqlite qui se charge BEAUCOUP plus rapidement que read.table (), puis à extraire uniquement ce que vous voulez. le paquet sqldf () rend tout cela assez facile. Voici un lien vers une réponse de débordement de pile précédente qui donne des exemples de code pour sqldf ().
C'est probablement plus que ce dont vous avez besoin, mais si vous utilisez des ensembles de données très volumineux , vous pouvez également consulter le Package HadoopStreaming qui fournit une routine de réduction de carte en utilisant Hadoop .