2010-09-04 9 views
5

Estoy acostumbrado a perl y nuevo en R. Sé que puede leer tablas completas usando read.table() pero me pregunto cómo puedo usar R para analizar una sola línea desde un archivo de entrada.Análisis básico de archivos de entrada en R

Específicamente, ¿cuál es el equivalente a la siguiente fragmento de Perl:

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

Respuesta

3

similar a la anterior sería:

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 función de archivo crea una conexión con el archivo y lo abre, la apertura es opcional, pero si no abra el archivo y luego, cuando lo lea, se abrirá y luego volverá a cerrar el archivo; si abre el archivo, permanecerá abierto y la siguiente lectura continuará desde donde dejó el anterior (lo más parecido posible a lo que Perl haría) encima).

La función readLines leerá el número especificado de líneas (1 en este caso) luego strsplit funciona básicamente igual que la función de división Perl.

R no tiene la asignación múltiple como Perl (a menudo es mejor mantener los resultados juntos de todos modos en lugar de dividirlos en múltiples variables globales).

+0

Una advertencia: esto cargaría todo el archivo en la memoria y dividiría todas sus líneas. Si el archivo es enorme y solo necesitas los tres primeros elementos, esta no es una buena idea. – mbq

+0

Para un archivo pequeño, puede leer todo, pero para archivos más grandes solo leerá parte en la memoria, a medida que continúe leyendo desde el archivo obtendrá fragmentos adicionales. –

1

En general, se debe utilizar scan hacer esto, o en casos más complejos leer todo el archivo con readLines y analizar de forma manual con strsplit s, grep s y esas cosas.

En su caso:

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

Sólo para mostrar otra manera de hacerlo (asumiendo que su entrada es "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) 

supongo que la parte más importante por encima de la hora de abordar su pregunta es simplemente

nrows=1 

que le indica que analice una fila de entrada. (Debajo de read.csv, finalmente, solo se oprime para escanear.)

Cuestiones relacionadas