сопоставление с образцом в R с использованием grepl

У меня есть кадр данных dat, подобный этому

P pedigree cas 1 M rs2745406 T 2 M rs6939431 A 3 M SNP_DPB1_33156641 G 4 M SNP_DPB1_33156664_G P 5 M SNP_DPB1_33156664_A A 6 M SNP_DPB1_33156664_T A

Я хочу исключить все строки, в которых столбец pedigree начинается с SNP_ и заканчивается G, C, T или A (_[GCTA]). В данном случае это будут строки 4,5,6.

Как я могу добиться этого в R? я пытался

multisnp <- which(grepl("^SNP_*_[GCTA]$", dat$pedigree)=="TRUE")

new_dat <- dat[-multisnp,]

Мой вектор multisnp пуст, но я не могу понять, как его исправить, чтобы он соответствовал нужному шаблону. Я думаю, что это неправильное использование подстановочного знака *.


person user3745089    schedule 21.05.2015    source источник
comment
Это должно сделать работу: dat2 <- dat[!grepl("^SNP_\\.*_[GCAT]$", dat$pedigree), perl = T].   -  person B.Shankar    schedule 21.05.2015


Ответы (2)


Вы можете использовать следующее с .*? (сопоставьте все не жадным способом):

multisnp <- which(grepl("^SNP_.*?_[GCTA]$", dat$pedigree))
                              ^^^
person karthik manchala    schedule 21.05.2015
comment
Это работает! Не могли бы вы объяснить, что означает .*?? Я знаю, что * означает соответствие предыдущему элементу ноль или более раз, но я не уверен, что означает эта комбинация. - person user3745089; 21.05.2015
comment
. означает любой символ.. * означает, как вы знаете.. соответствует 0 или более раз.. и *? означает 0 или более раз нежадным способом.. * по умолчанию является жадным и сопоставляет все после него, иногда игнорируя соответствие шаблону после .* .. надеюсь, это поможет .. :) - person karthik manchala; 21.05.2015
comment
Я чувствую, что здесь задействована очень тесная скобка, которая также присутствует в коде OP. - person blakeoft; 21.05.2015
comment
Я думаю, что это был близкий парен после регулярного выражения, которое нужно было убрать. - person blakeoft; 21.05.2015
comment
Это не исправлено. изменить вот и все. Хотя использование which с == TRUE бесполезно. - person Pierre L; 21.05.2015
comment
@blakeoft еще раз спасибо .. у меня сейчас нет редактора для тестирования .. не могу проверить синтаксис .. - person karthik manchala; 21.05.2015
comment
Я могу подтвердить, что это работает сейчас, по крайней мере, для предоставленного образца. - person blakeoft; 21.05.2015
comment
Попробуйте код без TRUE в конце, это лишнее. which(grepl("^SNP_.*?_[GCTA]$", dat$pedigree)) - person Pierre L; 21.05.2015
comment
@plafort снова.. не смог проверить.. но логически ты прав.. обновил.. :) - person karthik manchala; 21.05.2015
comment
@blakeoft Я удалил ошибочную закрывающую скобку в своем редактировании, спасибо! - person user3745089; 21.05.2015

Вы можете подмножество dat следующим образом

new_dat <- dat[!grepl("^SNP_.*_[GCTA]$", dat$pedigree), ]

Что касается кода, который вы пробовали, я не уверен, что grepl("^SNP_*_[GCTA]$") завершится без ошибок, поскольку вы не передаете вектор x в grepl. См. ?grepl для получения дополнительной информации.

person blakeoft    schedule 21.05.2015