2010-09-04 2 views
5

Je suis habitué à perl et nouveau dans R. Je sais que vous pouvez lire des tables entières en utilisant read.table() mais je me demande comment utiliser R pour analyser une seule ligne à partir d'un fichier d'entrée.Analyse de base du fichier d'entrée dans R

Plus précisément, ce qui est l'équivalent à l'extrait de code Perl suivant:

open my $fh, $filename or die 'can't open file $filename'; 
my $line = <$fh>; 
my ($first, $second, $third) = split ("\t", $line); 

Répondre

3

similaires à ci-dessus serait:

filename <- 'your/file/name/here' 
fh <- file(filename, open='rt') 
line <- readLines(fh, n=1) 
tmp <- strsplit(line, "\\t") 
first <- tmp[[1]][1]; second <- tmp[[1]][2]; third <- tmp[[1]][3] 

La fonction de fichier crée une connexion au fichier et l'ouvre, l'ouverture est facultative, mais si vous n'ouvre pas le fichier puis quand tu le liras il ouvrira puis referera le fichier, si tu ouvres le fichier alors il reste ouvert et la lecture suivante continue d'où le précédent est parti (plus proche de ce que ferait Perl au dessus).

La fonction readLines lit le nombre de lignes spécifié (1 dans ce cas) puis strsplit fonctionne essentiellement de la même manière que la fonction de partage Perl. R n'a pas l'assignation multiple comme Perl (il est souvent préférable de conserver les résultats ensemble plutôt que de les diviser en plusieurs variables globales).

+0

Un avertissement - cela chargerait le fichier entier en mémoire et diviserait toutes ses lignes. Si le fichier est énorme et que vous n'avez besoin que des trois premiers éléments, ce n'est certainement pas une bonne idée. – mbq

+0

Pour un petit fichier, il peut lire le tout, mais pour les fichiers plus volumineux, il ne lira que la partie en mémoire, car vous continuez à lire dans le fichier, il va saisir des morceaux supplémentaires. –

1

En général, vous devez utiliser scan pour ce faire, ou dans des cas plus complexes lire le fichier entier avec readLines et analyser manuellement avec strsplit s, grep s et d'autres choses.

Dans votre cas:

scan(filename,character(0),nmax=3)->d 
first<-d[1];d[2]->second;third<-d[3] 
0

Juste pour montrer une autre façon de le faire (en supposant que votre entrée est « temp/3.txt »):

> d <- read.csv("temp/3.txt", sep="\t", stringsAsFactors=F, header=F, nrows=1) 
# Show the default column names: 
> colnames(d) 
[1] "V1" "V2" "V3" 
# Assign the requested column names 
> colnames(d) <- c("first", "second", "third") 
# Show the current structure of d 
> d 
    first second third 
1  1  2  3 
# Probably not recommended: Add the columns of d to the search path 
> attach(d) 
> first 
[1] 1 
# Clean up: 
> detach(d) 

Je pense que la partie la plus importante ci-dessus en termes d'aborder votre question est tout simplement

nrows=1 

qui lui dit d'analyser une ligne d'entrée. (Au-dessous de read.csv, il suffit d'appeler pour numériser.)