У меня есть вектор таких строк (часть гораздо большего размера):

a <- c("My string",
       "characters",
       "sentence",
       "text.",
       "My string word sentence word.",
       "Other thing word sentence characters.",
       "My string word sentence numbers.",
       "Other thing",
       "word.",
       "sentence",
       "text.",
       "Other thing word. characters sentence.",
       "Different string word text.",
       "Different string.",
       "word.",
       "sentence.",
       "My string",
       "word",
       "sentence",
       "things.",
       "My string word sentence blah.")

Как видите, вектор содержит некоторые выражения, некоторые из которых находятся в одном элементе, а другие разделены на несколько элементов (что нормально). Также обратите внимание, что некоторые из них имеют несколько точек в одной или разделенных строках. Я хочу извлечь те элементы, которые начинаются с My string и заканчиваются точкой в ​​том же элементе (если все выражение находится в одной строке) или в конце последнего элемента, который завершает выражение, начинающееся с My string.

Как я себе представляю, сначала проиндексируйте все элементы, содержащие My string:

> b <- grep(pattern = "My string", x = a, fixed = TRUE)
> b
[1]  1  5  7 17 21

Затем проиндексируйте все точки, которые находятся в конце строки:

> c <- grep(pattern = "\\.$", x = a)
> c
 [1]  4  5  6  7  9 11 12 13 14 15 16 20 21

И в конце получите только позиции ПЕРВОГО периода после каждого из выражений, начинающихся с My string (в одном элементе или распределении по элементам). Тогда было бы легко просто выделить только те элементы, которые мне нужны, чтобы получить что-то вроде этого:

d <- c("My string",
       "characters",
       "sentence",
       "text.",
       "My string word sentence word.",
       "My string word sentence numbers.",
       "My string",
       "word",
       "sentence",
       "things.",
       "My string word sentence blah.")

Может ли кто-нибудь помочь с последним шагом (получить только позицию ПЕРВОГО периода после каждого из выражений, начинающихся с My string)?

0
panman 21 Окт 2015 в 23:22

2 ответа

Лучший ответ

Я думаю что-то подобное сделает то, что ты хочешь

b <- grep(pattern = "My string", x = a, fixed = TRUE)
c <- grep(pattern = "\\.$", x = a)

# find first period for each start string
e <- sapply(b, function(x) head(c[c>=x],1))

# extract ranges
d <- a[unlist(Map(`:`, b,e))]

#  [1] "My string"                       
#  [2] "characters"                      
#  [3] "sentence"                        
#  [4] "text."                           
#  [5] "My string word sentence word."   
#  [6] "My string word sentence numbers."
#  [7] "My string"                       
#  [8] "word"                            
#  [9] "sentence"                        
# [10] "things."                         
# [11] "My string word sentence blah."
1
MrFlick 21 Окт 2015 в 20:37

Вот альтернативный подход с dplyr

library(dplyr)

a <- c("My string",
       "characters",
       "sentence",
       "text.",
       "My string word sentence word.",
       "Other thing word sentence characters.",
       "My string word sentence numbers.",
       "Other thing",
       "word.",
       "sentence",
       "text.",
       "Other thing word. characters sentence.",
       "Different string word text.",
       "Different string.",
       "word.",
       "sentence.",
       "My string",
       "word",
       "sentence",
       "things.",
       "My string word sentence blah.")

data.frame(a = a,
           stringsAsFactors = FALSE) %>%
  mutate(period = grepl("[.]", a), 
         sentence_id = lag(cumsum(period), default = 0)) %>%
  group_by(sentence_id) %>%
  mutate(retain = any(grepl("My string", a))) %>%
  ungroup() %>%
  filter(retain)

Процесс состоит в том, чтобы идентифицировать элементы, у которых есть точка, и использовать эти индексы, чтобы указать, когда начинаются новые предложения. Это дает нам предложение_id для группировки, и тогда нам нужно только искать строку "My string".

2
Benjamin 21 Окт 2015 в 20:40