Подтвердить что ты не робот

Греп в 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)

Какой будет правильный синтаксис?

4b9b3361

Ответ 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

Готово!