Как извлечь только предложения, соответствующие условию слова, сохраняя фрейм данных - PullRequest
1 голос
/ 01 мая 2019

Раздел кода под ним - хорошее представление набора данных, с которым я имею дело.

x <- "test is bad. test1 is good. but test is better. Yet test1 is fake"
y <- "test1 is bad. test is good. but test1 is better. Yet test is fake"
a <- "this sentence is for trying purposes"
z <- data.frame(text = c(x,y,a))
z$date <- c("2011","2012","2015")
z$amount <- c(20000, 300, 5600)
z$text <- as.character(z$text)

То, что я хочу сделать, - это по существу извлечь только предложения, содержащие слово test1, и проанализировать их в новом столбце (z $ предложений), чтобы выполнять другие операции.

Я попытался использовать следующее:

z$sentences <- grep("test1", unlist(strsplit(z$text, '(?<=\\.)\\s+', 
                              perl=TRUE)), value=TRUE)

Но он возвращает ошибку, потому что замена имеет 4 строки, а данные имеют 3.

Я также пытался сunlist, но другая информация столбца, к сожалению, теряется в процессе.

2 для этого удовлетворительные результаты:

Дополнительный столбец с предложениями, содержащими только «test1» или длинный формат, в котором каждая строка все еще содержитданные (дата, количество) с предложениями.

Ожидаемый результат:

With all sentences that match in column

Со всеми предложениями, которые совпадают в столбце

with a new row for each sentence matching condition

с новой строкой для каждого предложения, соответствующего условию, хотя последняя строка не должна присутствовать.

Любая помощь приветствуется

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Проблема в том, что grep возвращает только элементы match, которые могут быть меньше исходной длины

lst1 <- strsplit(z$text, '(?<=\\.)\\s+', perl = TRUE)
z$sentences <- sapply(lst1, function(x) paste(grep("test1", x, 
        value = TRUE), collapse=" "))

Другой вариант без разделения будет gsub

trimws(gsub("(([A-Za-z, ]*)test1[A-Za-z, ]+\\.?)(*SKIP)(*F)|.",
             "", z$text, perl = TRUE))
#[1] "test1 is good. Yet test1 is fake"   "test1 is bad. but test1 is better."
#[3] "" 
0 голосов
/ 02 мая 2019

Вы можете использовать str_extract из пакета stringr.

library(stringr)

z$sentences <- str_extract(z$text,'.*test1.*')

z
                                                               text date amount                                                         sentences
1 test is bad. test1 is good. but test is better. Yet test1 is fake 2011  20000 test is bad. test1 is good. but test is better. Yet test1 is fake
2 test1 is bad. test is good. but test1 is better. Yet test is fake 2012    300 test1 is bad. test is good. but test1 is better. Yet test is fake
3                              this sentence is for trying purposes 2015   5600                                                              <NA>


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