如何使grepl功能具体?

时间:2015-06-03 05:12:18

标签: r extract

我的数据框如下所示。我需要根据" geneID"的名称提取特定行的数据。专栏一个接一个。我使用grepl函数。

#Data frame:geneDf  
geneID=c("EGFR","Her2","PTENPP","PTEN")
patient1=c(12,23,56,23)
patient2=c(23,34,11,6)
patient3=c(56,44,32,45)
patient4=c(23,64,45,23)
geneDf=data.frame(patient1,patient2,patient3,patient4,geneID)

geneDf
  patient1 patient2 patient3 patient4 geneID
1       12       23       56       23   EGFR
2       23       34       44       64   Her2
3       56       11       32       45 PTENPP
4       23        6       45       23   PTEN

前三行效果很好。

targetGene<-subset(geneDf,grepl(geneDf$geneID[1],geneDf$geneID))
targetGene
  patient1 patient2 patient3 patient4 geneID
1       12       23       56       23   EGFR

当我提取第4行的数据时,我得到了这个:

targetGene<-subset(geneDf,grepl(geneDf$geneID[4],geneDf$geneID))
targetGene
  patient1 patient2 patient3 patient4 geneID
3       56       11       32       45 PTENPP
4       23        6       45       23   PTEN

似乎是其他数据,在这种情况下,第3行&#34; geneID&#34;列,包括第4行的内容也被拾取。我的命令出了什么问题?如何使它每次只获取某一行的数据?

2 个答案:

答案 0 :(得分:5)

您可能需要word boundary,即\\b或使用

subset(geneDf, grepl(paste0('^', geneID[4], '$'), geneID))
#  patient1 patient2 patient3 patient4 geneID
#4       23        6       45       23   PTEN

或者

subset(geneDf, grepl(paste0('\\b', geneID[4], '\\b'), geneID))
#   patient1 patient2 patient3 patient4 geneID
#4       23        6       45       23   PTEN

答案 1 :(得分:4)

@akrun已经回答了您的具体问题,但是如果您希望根据另一个变量创建数据的子集,您可能也对split函数感兴趣:

split(geneDf, geneDf$geneID)
## $EGFR
##   patient1 patient2 patient3 patient4 geneID
## 1       12       23       56       23   EGFR
## 
## $Her2
##   patient1 patient2 patient3 patient4 geneID
## 2       23       34       44       64   Her2
## 
## $PTEN
##   patient1 patient2 patient3 patient4 geneID
## 4       23        6       45       23   PTEN
## 
## $PTENPP
##   patient1 patient2 patient3 patient4 geneID
## 3       56       11       32       45 PTENPP
##