2016-11-30 12 views
4

У меня есть два персонажа векторов:Удаление записей из строки вектора, содержащие специальные символы в R

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

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

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

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

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

ответ

4

Мы можем использовать 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)] 
4

ответ, данный @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 
+1

Большой выбор. Плюс один. Это было бы намного лучше, если бы количество векторных элементов для сравнения было огромным, и grep не будет работать должным образом. – akrun

+0

Я согласен с akrun. Это очень полезно, но в этом случае я предпочитаю, чтобы grep-решение для моих векторов было не так долго. – Lecromine

0

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

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