Мне кажется, я узнаю закономерность, хотя, возможно, вам понадобится прояснить одно или два моих предположения.(Я думаю, вполне вероятно, что ваш метод чтения данных может предотвратить необходимость в этих предположениях, но я точно не знаю.)
Во-первых, я сделаю «карту» регулярных выраженийpattern-to-column-name:
patterns <- c(title = "^#\\*", author = "^#@",
year = "^#t", revue = "^#c",
id_paper = "^#index", abstract = "^#%",
mismatch = "^([^#]|#[^*@%tci])")
Теперь, предполагая, что заголовок всегда является первым в последовательности других полей, я разделю вектор на список векторов на заголовок:
titles <- split(text, cumsum(grepl("^#\\*", text)))
str(titles)
# List of 2
# $ 1: chr [1:6] "#*TeX: The Program" "#@Donald E. Knuth" "#t1986" "#c" ...
# $ 2: chr [1:11] "#*Foundations of Databases." "#@Serge Abiteboul,Richard Hull,Victor Vianu" "#t1995" "#c" ...
Теперь быстрая вспомогательная функция:
standardize_title <- function(x) {
o <- lapply(patterns, function(ptn) paste(x[grepl(ptn, x)], collapse = ", "))
o[nchar(o) == 0] <- NA_character_
o
}
А теперь примените эту функцию к каждому заголовку titles
:
do.call(rbind.data.frame, c(stringsAsFactors=FALSE, lapply(titles, standardize_title)))
# title author year revue id_paper abstract mismatch
# 1 #*TeX: The Program #@Donald E. Knuth #t1986 #c #index68 <NA> <NA>
# 2 #*Foundations of Databases. #@Serge Abiteboul,Richard Hull,Victor Vianu #t1995 #c #index69 #%1118192, #%189, #%1088975, #%971271, #%832272 #!From the Book: This book will teach you how to write specifications of computer systems, using the language TLA+.
(Можно такжеиспользуйте dplyr::bind_rows
или data.table::rbindlist
вместо do.call(rbind.data.frame, ...)
.)
Самым большим предположением является то, что заголовок всегда является первым среди шаблонов.Если это не так, то вы получите неверные результаты, хотя предупреждений или ошибок с таким эффектом не будет.