Структурирование большого текстового файла в фрейм данных с использованием R - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть текстовый файл около 20 страниц с около 200 абзацами.Каждый абзац содержит три строки, описывающие информацию о человеке, например так:

Name: John
Age: 26
Phone number: 123421

Name: Mary
Age: 80
Phone number: NA

...

Теперь я хочу преобразовать этот большой файл в кадр данных, где столбцы представляют три переменные Имя, Возраст и Номер телефона и где строкисоответствуют лицам.

Name      Age      Phone number
John      26       123421
Mary      80       NA
...       ...      ...

Как преобразовать большой текстовый файл в такой кадр данных?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

read.dcf() из базы R был создан для чтения данных этого типа:

read.dcf(textConnection(test), all = TRUE)
  Name Age Phone number
1 John  26       123421
2 Mary  80           NA

Краткое описание DCF («Файл управления Debian»)формат можно найти по адресу help("read.dcf").

Данные

test <-
"Name: John
Age: 26
Phone number: 123421

Name: Mary
Age: 80
Phone number: NA
"
0 голосов
/ 15 февраля 2019

Не красиво, но вот опция регулярных выражений, которая может работать в зависимости от того, как считываются данные,

test<-
"Name: John
Age: 26
Phone number: 123421

Name: Mary
Age: 80
Phone number: NA
"

Это читается как:

[1] "Name: John\nAge: 26\nPhone number: 123421\n\nName: Mary\nAge: 80\nPhone number: NA\n"

Теперь используется регулярное выражениечтобы получить все совпадения, всегда перехватывая NA, чтобы обеспечить одинаковое количество строк:

Names<-regmatches(test, gregexpr("(?<=Name: )[a-zA-Z]+", test, perl=TRUE))

Numbers<-regmatches(test, gregexpr("(?<=Phone number: )[a-zA-Z0-9]+", test, perl=TRUE))

Age<-regmatches(test, gregexpr("(?<=Age: )[a-zA-Z0-9]+", test, perl=TRUE))

df<-data.frame(Names,Numbers,Age)
names(df)<-c("Name","Number","Age")

> df
  Name Number Age
1 John 123421  26
2 Mary     NA  80

Вот как отформатировать данные для этого подхода, если они читаются с использованием read.csv

test<-read.csv(text=test, header=F, stringsAsFactors=FALSE)
test<-list(test$V1)
test<-paste(unlist(test), collapse =" ")
>test
[1] "Name: John Age: 26 Phone number: 123421 Name: Mary Age: 80 Phone number: NA"

Если у вас есть фамилии, наше регулярное выражение для аргумента Names также необходимо изменить:

(?<=Name: ).+?(?=Age)

...