2015-02-05 3 views
0

У меня есть два кадра данных, один из которых представляет собой список известных генов, участвующих в заболевании x, а другой - данные массива. в строгом пример двух dataframes являются:Функция совпадения цикла в R

knownGene <- as.dataframe(geneID = c(gene1, gene2, gene3, gene5, gene5), chr = c(16,3,4,1,10)) 

arrayData <- as.dataframe(sampleID = c(xyz1,xyz1,xyz1,xyz2,xyz2,xyz2,xyz2), geneID = c(gene1, gene3, gene4, gene2, gene1, gene3, gene4, gene5) 

Данные массива может иметь гены, перечисленные несколько раз (например, множественные образцы могут иметь вариации в том же гене). Поэтому выполнение соответствия

Matched<-arrayData[na.omit(match(knownGene$geneID, arrayData$geneID)),] 

будет производить только первое совпадение, например, только максимум один образец на ген будет вытащен. Если я использую grep в цикле, я получаю много генов, которые не находятся в моем имени, из-за того, что grep вытягивает термины, содержащие x символов. Мой цикл похож на этот

for (i in 1:length(knownGene$geneID)){ 
    x<-arrayData[grep(knownGene[i,2],arrayData$geneID),] 
    df<-rbind(df,x) 
} 

Есть ли способ, чтобы использовать либо матч, как это в цикле (все мои попытки потерпели неудачу до сих пор). Или уметь grep точные термины в цикле, я знаю, что вы можете grep точные термины, если строка предоставляется.

+2

Моя первая мысль заключается в том, что для этого может быть использован другой способ, но то, что вы пытаетесь сделать, мне не совсем понятно. Можете ли вы предоставить небольшой пример набора данных (используя dput, возможно) с нужным выходом? – Aaron

ответ

0

Я думаю, вы хотите:

arrayData[arrayData$geneID %in% knownGene$geneID,] 

Если вы хотите сделать Grep вещь, вы могли бы заменить это:

grep(knownGene[i,2],arrayData$geneID) 

с этим:

grep(paste0('^',knownGene[i,2],'$'),arrayData$geneID) 

так ^ и $ соответствуют началу и концу строки, соответственно

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