web-dev-qa-db-fra.com

Comment lire uniquement les colonnes d'un fichier dans R? (Un juste milieu entre `read.table` et` scan`?)

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?).

40
Alex Stoddard

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.

35
Ken Williams

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.

19
Dirk Eddelbuettel

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 ().

8
JD Long

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 .

3
Shane