Удалить записи из вектора строки, содержащие определенные символы в R [дубликаты]

У меня есть два вектора символов:

x = {"a", "b", "c", "kt"}
y = {"abs", "kot", "ccf", "okt", "kk", "y"}

Мне нужно использовать x для удаления записей из y, чтобы остались только строки, которые не содержат ни одной из записей x, например:

y = {"kot", "kk", "y"}

Код должен работать для любого размера векторов x и y.

До сих пор я пытался использовать gsub и grepl, но они работают только с одиночными строками. Я попытался создать цикл для этого, но проблема кажется более сложной, чем я думал. И конечно, чем сложнее решение, тем лучше, но можно предположить, что в этом случае векторы x и y имеют до 200 элементов.


person Lecromine    schedule 30.11.2016    source источник


Ответы (3)


Мы можем использовать grep, чтобы узнать, какие значения в y соответствуют шаблону в x, и исключить их, используя !%in%.

y[!y %in% grep(paste0(x, collapse = "|"), y, value = T)]

#[1] "kot" "kk"  "y"  

Или даже лучше с grepl, так как он возвращает логические векторы

y[!grepl(paste0(x, collapse = "|"), y)]

Краткая версия с grep с использованием параметров invert и value

grep(paste0(x, collapse = "|"), y, invert = TRUE, value = TRUE)
#[1] "kot" "kk"  "y"  
person Ronak Shah    schedule 30.11.2016

Ответ, данный @Ronak, выглядит предпочтительнее моего, но один из вариантов - использовать sapply с grepl, чтобы получить матрицу совпадений с y для каждой записи в x, а затем свернуть это с другим вызовом apply.

> y[!apply(sapply(x, function(q) {grepl(q, y)}), 1, function(x) {sum(as.numeric(x)) > 0})]
[1] "kot" "kk"  "y"  

Вот что я имею в виду под матрицей совпадений:

> sapply(x, function(q) { grepl(q, y) })
         a     b     c    kt
[1,]  TRUE  TRUE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE  TRUE FALSE
[4,] FALSE FALSE FALSE  TRUE
[5,] FALSE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE
       ^^^^ each column is a match result for each element of x
person Tim Biegeleisen    schedule 30.11.2016
comment
Согласен с Акруном. Это очень полезно, но в этом случае я предпочитаю grepl-решение, потому что мои векторы не такие длинные. - person Lecromine; 30.11.2016

Это также должно работать:

y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0]
# [1] "kot" "kk"  "y"  
person Sandipan Dey    schedule 30.11.2016