Греп в R с использованием OR и NOT
У меня есть следующий вектор в R, и я хотел бы найти все строки, содержащие A и B, но не число 2.
vec1<-c("A_cont_1", "A_cont_12", "B_treat_8", "AB_cont_22", "cont_21_Aa")
Не работает следующее:
grep("A|B|!2", vec1)
Это возвращает мне все строки:
[1] 1 2 3 4 5
То же самое относится и к этому примеру:
grep("A|B|-2", vec1)
Какой будет правильный синтаксис?
Ответы
Ответ 1
Вы можете сделать это с помощью довольно простого регулярного выражения:
grep("^[^2]*[AB][^2]*$", vec1)
В словах это означает:
-
^
соответствует началу строки
-
[^2]*
сопоставить что-либо, кроме "2", ноль или более раз
-
[AB]
соответствуют "A" или "B"
-
[^2]*
сопоставить что-либо, кроме "2", ноль или более раз
-
$
соответствует концу строки
Ответ 2
Я бы использовал два вызова grep
:
intersect(grep("A|B",vec1),grep("2",vec1,invert=TRUE))
#[1] 1 3
Ответ 3
OP, ваша попытка довольно близка, попробуйте следующее:
grep('^(A|B|[^2])*$', vec1)
Ответ 4
grep
обычно не очень хорошо работает для создания положительного и отрицательного поиска в одном вызове. Возможно, вы сможете заставить его работать со сложным регулярным выражением, но вам может быть лучше:
grep '[AB]' somefile.txt | grep -v '2'
R эквивалент этого будет:
grep("2", grep("A|B", vec1, value = T), invert = T)
Ответ 5
Я расширил ответ, предоставленный @eddi. Я проверил это в R, и это работает для меня. Я изменил последнюю переменную в вашем примере, так как все они содержали A | B.
# Create the vector from the OP with one change
vec1<-c("A_cont_1", "A_cont_12", "B_treat_8", "AB_cont_22", "cont_21_dd")
Затем я запустил следующий код. Он скажет вам, каких результатов вы должны ожидать от каждого раздела grep.
Сначала скажите мне, какие столбцы содержат A или B
> grepl("A|B", vec1)
[1] TRUE TRUE TRUE TRUE FALSE
Теперь скажите мне, какие столбцы содержат "2"
> grepl("2", vec1)
[1] FALSE TRUE FALSE TRUE TRUE
Индекс, который мы хотим, 2,4
> grep("2", grep("A|B", vec1, value = T))
[1] 2 4
Готово!