2015-05-21 3 views
1

У меня есть dataframe dat как этогошаблона в R, используя grepl

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 вектор пуст, но я не могу понять, как это исправить, так что он соответствует шаблону, я хочу. Я думаю, что это неправильное использование моего шаблона *.

+0

Это должно выполнить эту задачу: 'dat2 <- dat [! Grepl ("^SNP _ \\. * _ [GCAT] $ ", dat $ родословная), perl = T]'. –

ответ

2

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

multisnp <- which(grepl("^SNP_.*?_[GCTA]$", dat$pedigree)) 
           ^^^ 
+0

Это работает! Не могли бы вы объяснить, что означает '. *?'? Я знаю, что '*' означает совпадение предыдущего материала с нулем или более раз, но я не уверен, что означает эта комбинация. – user3745089

+1

'.' означает любой символ ..' * 'означает, как вы знаете .. соответствует 0 или более раз .. и' *? 'Означает 0 или более раз не алчным способом.' * 'Жадно по умолчанию и соответствует всем, после чего иногда игнорируется, чтобы соответствовать шаблону после '. *' .. надеюсь, что это поможет .. :) –

+0

Я чувствую, что здесь добавлен дополнительный закрытый парам, который также присутствует в коде OP. – blakeoft

1

Вы можете Подмножество dat как этот

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

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

Смежные вопросы