Не красиво, но вот опция регулярных выражений, которая может работать в зависимости от того, как считываются данные,
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)