Основной синтаксический анализ входного файла в R - PullRequest
5 голосов
/ 04 сентября 2010

Я привык к Perl и плохо знаком с R. Я знаю, что вы можете читать целые таблицы, используя read.table(), но мне интересно, как я могу использовать R для разбора одной строки из входного файла.

В частности, что эквивалентно следующему фрагменту perl:

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

Ответы [ 3 ]

3 голосов
/ 04 сентября 2010

Аналогично вышесказанному будет:

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]

Файловая функция создает соединение с файлом и открывает его, открытие не является обязательным, но если вы не открываете файл, то при чтении из него он открывается, а затем снова закрывает файл, если вы открываете файл затем он остается открытым, и следующее чтение продолжается с того места, где было оставлено предыдущее (наиболее близкое соответствие тому, что Perl делал бы выше).

Функция readLines считывает указанное количество строк (в данном случае 1) тогда strsplit работает в основном так же, как функция разделения Perl.

R не имеет множественного присваивания, как Perl (часто лучше в любом случае просто сохранить результаты вместе, чем разбивать их на несколько глобальных переменных).

1 голос
/ 04 сентября 2010

В общем, вы должны использовать scan, чтобы сделать это, или в более сложных случаях прочитать весь файл с помощью readLines и разобрать его вручную с помощью strsplit s, grep s и прочее.

В вашем случае:

scan(filename,character(0),nmax=3)->d
first<-d[1];d[2]->second;third<-d[3]
0 голосов
/ 05 сентября 2010

Просто чтобы показать другой способ сделать это (при условии, что вы вводите "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)

Я думаю, что самая важная часть с точки зрения решения вашего вопроса просто

nrows=1

, что говорит ему о необходимости проанализировать одну строку ввода.(Под read.csv в конечном итоге просто вызывает сканирование.)

...