【问题标题】:How to subset data with advance string matching如何使用高级字符串匹配对数据进行子集化
【发布时间】:2012-10-11 10:26:05
【问题描述】:

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

> 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 中匹配字符串的两行,适用于以下内容:

> 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_ID,所以我正在寻找一种通用方法来判断 $RefSeq_ID 是否包含某个字符串模式,然后将该行子集化。

【问题讨论】:

    标签: r string-matching subset


    【解决方案1】:

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

    ##Notice that the first element appears in 
    ##a row containing commas
    l = c( "NM_013433", "NM_001386", "NM_020385")
    

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

    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
    

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

    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
    

    所以

    subset(GEMA_EO5, grepl(paste(l, collapse="|"),GEMA_EO5$RefSeq_ID))
    

    应该给你你想要的。

    【讨论】:

    • 谢谢!它完美地完成了这项工作......我曾尝试使用 grepl,但由于它只需要向量的第一个元素,我无法让它工作。您通过 paste(l,collapse="|") 绕过它所以这是用或分隔的字符串?我想我应该更多地研究正则表达式:-)
    • 是的,字符串用“ORs”隔开
    【解决方案2】:

    另一种方法是将RefSeq_ID 中的重复条目识别为尝试在单个数据框中表示两个数据库表。所以如果原表是csv,那么把数据归一化成两张表

    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(选择),然后是与Anno 的merge(连接)

    l <- c( "NM_013433", "NM_001386", "NM_020385")
    merge(Anno, subset(RefSeq, ID %in% l))[, -1]
    

    导致

    > 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 <- cbind(key = seq_len(nrow(csv)), csv)
    merge(Master, subset(RefSeq, ID %in% l))[,-1]
    

    或类似的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 2016-10-04
      • 2022-01-17
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多