Удалить только некоторые разрывы строк в R - PullRequest
0 голосов
/ 01 июня 2018

Я читаю текстовый файл в R:

text <- read_delim("textfile.txt", "\n", escape_double = F, col_names = F, trim_ws = T)

Соответствующая часть заключается в том, что он разделен переносами строк.Затем я разделяю его на колонку оратора и колонку комментариев:

    text2 <- text %>%
  separate(X1, into = c("speaker", "comment"), sep = ":")

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

Проблема заключается в том, чтов некоторых длинных комментариях есть разрывы строк.Это портит структуру данных, помещая комментарий после разрыва строки в колонке спикера и затем NA в разделе комментариев.

Как я могу сказать R игнорировать эти встроенные разрывы строк?Если это помогает, столбцы разделяются двоеточием (т. Е. Интервьюер: как дела?), Поэтому перед «истинным» переводом строки должен быть только один двоеточие.

Спасибо!

1 Ответ

0 голосов
/ 01 июня 2018

Я собираюсь работать в предположении, что ваш входной файл выглядит следующим образом:

textfile.txt

Interviewer: How are you?
Respondant: I'm fine.
Interviewer: The issue is that some of the long comments have line breaks
embedded in them. This messes up the data structure putting the comment after
the line break in the speaker column and then an NA in the comments section.
Respondant: How can I tell R to ignore these embedded line breaks? If it helps,
the columns are separated by a colon (i.e. Interviewer: How are you?), so there
should be only one colon before the "true" line break.

Если это так, этот процесс должен работать:

  1. Считайте строки в векторе.
  2. Узнайте, какие строки начинаются с имени говорящего.
  3. Распределите все строки по тем местам, где они находятся между этими"линии.
  4. Объедините комментарии в блоки.
  5. Вытащите имена ораторов для каждого блока комментария.
  6. data_frame it.

library(stringi)
library(dplyr)

text <- readLines("textfile.txt")
speaker_pattern <- "^\\w+(?=:)"
comment_starts <- which(stri_detect_regex(text, speaker_pattern))
comment_groups <- findInterval(seq_along(text), comment_starts)
comments <- text %>%
  split(comment_groups) %>%
  vapply(FUN = paste0, FUN.VALUE = character(1), collapse = "\n")
speakers <- stri_extract_first_regex(comments, speaker_pattern)
comments <- stri_replace_first_regex(comments, "^\\w+: ", "")
text2 <- data_frame(speaker = speakers, comment = comments)

text2
# # A tibble: 4 x 2
#   speaker     comment                                            
#   <chr>       <chr>                                              
# 1 Interviewer How are you?                                       
# 2 Respondant  I'm fine.                                          
# 3 Interviewer "The issue is that some of the long comments have ~
# 4 Respondant  "How can I tell R to ignore these embedded line br~
...