#r #text
Вопрос:
Вот мои данные
title <- c("title1","title2")
text <- c("Mr.A.Speech1.\nMr.B.Speech2.\nMr.C.Speech3\n","Mrs.D.Speech4.\nMs.E.Speech5.\n")
df<- data.frame(title, text)
Я хочу, чтобы каждая речь была в виде строки, помеченной заголовком:
Title Name. Text
1. title1 Mr.A Speech1.
2. title1 Mr.B Speech2.
3. title1 Mr.C Speech3.
4. title1 Mrs.D Speech4.
5. title1 Ms.E Speech5.
Я могу разбить только одно наблюдение текста, например, на разбивку
name <- unlist(str_extract_all(df$text,"\bM(?:rs?|s)\.\s[:upper:]{1,20}\s?c?'?-?[:upper:]{1,20}\s?o?f?\s?|The\sSPEAKER|The\sPRESIDING\s" ))
##breakdown speeches and remove content before the first name
pattern = "\bM(?:rs?|s)\.\s[:upper:]{1,20}\s?c?'?-?[:upper:]{1,20}\s?o?f?\s?|The\sSPEAKER|The\sPRESIDING\s"
df$text1 <- str_replace_all( df$text, pattern, "XXXX")
df$text2 <- gsub("^.*?XXXX","XXXX",df$text1)
dfa <- df[which(grepl("XXXX",df$text2)), ]
speech1 <- unlist(strsplit(df$text2, "XXXX"))
speech2 <- speech1[-1]
Text <- gsub("[\]", " ", speech2)
Как я могу добавить метку заголовка для каждой строки и применить разбивку для всего столбца? Спасибо!
Комментарии:
1. Код, который у тебя есть, не работает для меня.
nametest
возвращаетcharacter(0)
и, следовательноdftest
, не имеет строк.2. Мне очень жаль, и ты прав. Я просто поместил свой код (очень длинный) для моего реального набора данных в вопрос. Я использовал df1 <- dfa %>% separate_rows(text2, sep =»XXXX»)%<- dfa %>>% фильтр(text2 != «») и получил результаты. Большое спасибо!
Ответ №1:
Не лучшее решение, но регулярное выражение-не моя сильная сторона
df %>%
separate_rows(text,sep = "\\n") %>%
filter(text != "") %>%
separate(col = text,into = c("name","aux","text"),sep = "\.") %>%
mutate(name = paste(name,aux,sep = ".")) %>%
select(-aux)
# A tibble: 5 x 3
title name text
<chr> <chr> <chr>
1 title1 Mr.A Speech1
2 title1 Mr.B Speech2
3 title1 Mr.C Speech3
4 title2 Mrs.D Speech4
5 title2 Ms.E Speech5