Обратное соответствие со строкой - PullRequest
0 голосов
/ 15 мая 2018

Я хочу удалить все символы, которые не соответствуют строковому шаблону, используя пакет stringr. До сих пор я был в состоянии удалить их до шаблона, используя "\\w+(?= (grape|satsuma))" в качестве шаблона, но удалить их после того, как шаблон все еще невозможен.

> str_remove_all("apples grape banana melon olive persimon grape apples satsuma papaya", 
+                "\\w+(?= (grape|satsuma))")
[1] " grape banana melon olive  grape  satsuma papaya"

Желаемый результат:

"grape grape satsuma"

( ПРИМЕЧАНИЕ : я знаю, что самый простой подход в этом случае состоит в том, чтобы извлечь только "виноград" и "сацума", но для целей анализа я предпочитаю этот способ)

Отредактировано с предоставлением всей проблемы

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

> d
# A tibble: 2 x 2
  string_column                  c2
  <chr>                       <dbl>
1 apples grape banana satsuma     3
2 grape banana satsuma melon      4

Используя ответ, предоставленный @ d.r works:

> d %>% 
+   mutate_at(vars(string_column), ~ gsub("(grape|satsuma| )(*SKIP)(*FAIL)|.", "", ., perl = TRUE))

# A tibble: 2 x 2
  string_column        c2
  <chr>             <dbl>
1 " grape  satsuma"     3
2 "grape  satsuma "     4

Все ответы, предоставленные на данный момент с использованием пакета stringr, не возвращают string_column

Это dput для d:

d <- structure(list(string_column = c("apples grape banana satsuma", 
"grape banana satsuma melon"), c2 = c(3, 4)), row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame"))

1 Ответ

0 голосов
/ 15 мая 2018

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

Однако, поскольку мы извлекаем слова, я бы предпочел использовать str_extract_all, и я 'я бы сделал это так:

str_extract_all("apples grape banana melon olive persimon grape apples satsuma papaya", 
                               "grape|satsuma")
 "grape"   "grape"   "satsuma"

Мне также очень нравится эта строка, которую @steveLangsford оставил в комментарии:

paste0(unlist(str_extract_all("apples grape banana melon olive persimon grape apples satsuma papaya", "grape|satsuma")), collapse=" ") 
"grape grape satsuma"

Рассмотрим это немного подробнее, основываясь на нашей дискуссии / комментариях:

string_column <- c("apples grape banana satsuma", "grape banana satsuma melon") 
c2            <- c(3, 4) 
d             <- tibble(string_column,c2) 

myfun <- function(x) {paste0(unlist(str_extract_all(x, "grape|satsuma")), collapse=" ") }

sapply(d$string_column, myfun)
        "grape satsuma"             "grape satsuma"
...