首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用高级字符串匹配对数据进行子集

如何使用高级字符串匹配对数据进行子集
EN

Stack Overflow用户
提问于 2012-10-11 18:26:05
回答 2查看 10.9K关注 0票数 11

我有下面的数据框,我想根据匹配的字符串从其中提取行。

代码语言:javascript
复制
> GEMA_EO5
gene_symbol  fold_EO  p_value                           RefSeq_ID      BH_p_value
       KNG1 3.433049 8.56e-28              NM_000893,NM_001102416    1.234245e-24
      REXO4 3.245317 1.78e-27                           NM_020385    2.281367e-24
      VPS29 3.827665 2.22e-25                 NM_057180,NM_016226    2.560770e-22
    CYP51A1 3.363149 5.95e-25              NM_000786,NM_001146152    6.239386e-22
      TNPO2 4.707600 1.60e-23 NM_001136195,NM_001136196,NM_013433    1.538000e-20
      NSDHL 2.703922 6.74e-23              NM_001129765,NM_015922    5.980454e-20
     DPYSL2 5.097382 1.29e-22                           NM_001386    1.062868e-19

因此,我想根据$RefSeq_ID中的匹配字符串提取两行,这与以下内容配合得很好:

代码语言:javascript
复制
> list<-c("NM_001386", "NM_020385")
> GEMA_EO6<-subset(GEMA_EO5, GEMA_EO5$RefSeq_ID %in% list, drop = TRUE)

> GEMA_EO6

gene_symbol  fold_EO  p_value RefSeq_ID    BH_p_value
      REXO4 3.245317 1.78e-27 NM_020385  2.281367e-24
     DPYSL2 5.097382 1.29e-22 NM_001386  1.062868e-19

但是有些行有几个用逗号分隔的RefSeq_IDs,所以我正在寻找一种通用的方法来判断$RefSeq_ID是否包含特定的字符串模式,然后对该行进行子集。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-11 18:43:46

要进行部分匹配,您需要使用正则表达式(请参阅?grepl)。以下是针对您的特定问题的解决方案:

代码语言:javascript
复制
##Notice that the first element appears in 
##a row containing commas
l = c( "NM_013433", "NM_001386", "NM_020385")

要一次测试一个序列,我们只需选择一个特定的seq id:

代码语言:javascript
复制
R> subset(GEMA_EO5, grepl(l[1], GEMA_EO5$RefSeq_ID))
  gene_symbol fold_EO p_value                           RefSeq_ID BH_p_value
5       TNPO2   4.708 1.6e-23 NM_001136195,NM_001136196,NM_013433  1.538e-20

为了测试多个基因,我们使用|运算符:

代码语言:javascript
复制
R> paste(l, collapse="|")
[1] "NM_013433|NM_001386|NM_020385"
R> grepl(paste(l, collapse="|"),GEMA_EO5$RefSeq_ID)
[1] FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE

所以

代码语言:javascript
复制
subset(GEMA_EO5, grepl(paste(l, collapse="|"),GEMA_EO5$RefSeq_ID))

应该能给你想要的。

票数 15
EN

Stack Overflow用户

发布于 2012-10-11 23:38:16

另一种方法是将RefSeq_ID中的重复条目识别为试图在单个数据帧中表示两个数据库表。因此,如果原始表为csv,则将数据规范化为两个表

代码语言:javascript
复制
Anno <- cbind(key = seq_len(nrow(csv)), csv[,names(csv) != "RefSeq_ID"])
key0 <- strsplit(csv$RefSeq_ID, ",")
RefSeq <- data.frame(key = rep(seq_along(key0), sapply(key0, length)),
                     ID = unlist(key0))

并识别出该查询是RefSeq表上的subset (select),后跟一个带有Anno的merge (join

代码语言:javascript
复制
l <- c( "NM_013433", "NM_001386", "NM_020385")
merge(Anno, subset(RefSeq, ID %in% l))[, -1]

导致

代码语言:javascript
复制
> merge(Anno, subset(RefSeq, ID %in% l))[, -1]
  gene_symbol  fold_EO  p_value   BH_p_value        ID
1       REXO4 3.245317 1.78e-27 2.281367e-24 NM_020385
2       TNPO2 4.707600 1.60e-23 1.538000e-20 NM_013433
3      DPYSL2 5.097382 1.29e-22 1.062868e-19 NM_001386

也许我们的目标是与一个‘`Master’表合并,然后

代码语言:javascript
复制
Master <- cbind(key = seq_len(nrow(csv)), csv)
merge(Master, subset(RefSeq, ID %in% l))[,-1]

或者类似的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12837462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档