Извлечение функции с помощью R - PullRequest
0 голосов
/ 01 декабря 2018

Мой вопрос касается извлечения объектов.

Я хотел бы построить фрейм данных из моего текста.

Мои данные:

text <- c("#*TeX: The Program",
      "#@Donald E. Knuth",
      "#t1986",
      "#c",
      "#index68",
      "",
      "#*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+.")

Мой ожидаемый результат -:

expected <- data.frame(title=c("#*TeX: The Program", "#*Foundations of Databases."), authors=c("#@Donald E. Knuth", "#@Serge Abiteboul,Richard Hull,Victor Vianu"), year=c("#t1986", "#t1995"), revue=c("#c", "#c"), id_paper=c("#index68", "#index69"),
                       id_ref=c(NA,"#%1118192, #%189, #%1088975, #%971271, #%832272"), abstract=c(NA, "#!From the Book: This book will teach you how to write specifications of computer systems, using the language TLA+."))

Заранее благодарим вас за ваши ответы или любые другие предложения.

1 Ответ

0 голосов
/ 01 декабря 2018

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

Во-первых, я сделаю «карту» регулярных выражений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, ...).)

Самым большим предположением является то, что заголовок всегда является первым среди шаблонов.Если это не так, то вы получите неверные результаты, хотя предупреждений или ошибок с таким эффектом не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...