【问题标题】:Find a list of strings across a data table in R在 R 中的数据表中查找字符串列表
【发布时间】:2015-08-07 17:39:38
【问题描述】:

我有一个字符串向量(候选),我想在数据表 (FBgn_Dmels) 中找到每个字符串,如果在一行中找到匹配项,则返回第一列条目(例如 CG2175 应返回“1-十二月”)。

> head(candidates)
[1] "CG2175" "CG31196"  "CG3169"  "CG15168" "CG2252"  "CG2019" 

> FBgn_Dmels
               V1_01       V1_02       V1_03       V1_04       V1_05       V1_06       V1_07       V1_08       V1_09   V1_10 V1_11 V1_12 V1_13 V1_14
    1:         1-Dec FBgn0000427 FBgn0000645      CG2175          NA          NA          NA          NA          NA      NA    NA    NA    NA    NA
    2:         1-Sep FBgn0011710 FBgn0005665 FBgn0013404 FBgn0014082 FBgn0024226      CG1403          NA          NA      NA    NA    NA    NA    NA
    3:         128up FBgn0010339 FBgn0010196      CG8340          NA          NA          NA          NA          NA      NA    NA    NA    NA    NA
    4: 14-3-3epsilon FBgn0020238 FBgn0011329 FBgn0016739 FBgn0016743 FBgn0046456 FBgn0051196 FBgn0064146 FBgn0066007 CG31196    NA    NA    NA    NA
    5:    14-3-3zeta FBgn0004907 FBgn0010635 FBgn0019723 FBgn0023038 FBgn0046306 FBgn0064146     CG17870          NA      NA    NA    NA    NA    NA
   ---                                                                                                                                              
17743:          Zw10 FBgn0004643 FBgn0000016 FBgn0002765 FBgn0029627      CG9900          NA          NA          NA      NA    NA    NA    NA    NA
17744:        Zwilch FBgn0061476 FBgn0036933 FBgn0042214     CG18729     CG18639          NA          NA          NA      NA    NA    NA    NA    NA
17745:           zyd FBgn0265767 FBgn0243503 FBgn0025689 FBgn0058147 FBgn0040030      CG2893     CG40147          NA      NA    NA    NA    NA    NA
17746:           zye FBgn0036985      CG5847          NA          NA          NA          NA          NA          NA      NA    NA    NA    NA    NA
17747:           Zyx FBgn0011642 FBgn0047225 FBgn0052018     CG32018          NA          NA          NA          NA      NA    NA    NA    NA    NA

我可以在数据帧上使用循环来解决这个问题,但它似乎非常缓慢且效率低下。我想知道是否有一种直接的方法可以对数据表执行此操作。

非常感谢您提出如何解决此问题的建议。

-地理位置

【问题讨论】:

  • 能否请您添加dput(head(FBgn_Dmels)) 的结果并显示您想要的结果
  • 当然! dput.txt。匹配应将第一列中的条目作为表格或列表返回。
  • 例如"1-Dec";"CG2175" "zye";"CG5847"

标签: r string search data.table


【解决方案1】:

相当老套,但似乎工作。我假设您的数据称为 FBgn_Dmels:

candidates <- c("CG2175", "CG31196", "CG3169", "CG15168", "CG2252", "CG2019")
getthem <- function(string){
  string <- paste0("^",string,"$")
  as.character(FBgn_Dmels[which(apply(FBgn_Dmels, 2, function(x) grepl(string, x, perl=TRUE)), arr.ind = TRUE)[1], "V1_01"][1])
}

申请(候选人,得到他们)

首先,我们定义了一个函数 (getthem),它获取单个匹配项的第一次出现,然后我们使用 sapply 来匹配所有候选对象。

【讨论】:

  • 我必须将 'j' 设置为列名才能显示第一列的值: (as.character(FBgn_Dmels[which(apply(FBgn_Dmels, 2, function(x) grepl(string, x, fixed=TRUE)), arr.ind = TRUE)[1], V1_01][1]) 。唯一剩下的问题是它不只返回完全匹配(此代码匹配 CG3196 到 CG31960 尽管fixed=TRUE)
  • ok 试试看:我已经把字符串改成了 ^string$ (^ 和 $ 是开始和结束,所以它不应该匹配其他人)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2021-02-16
  • 2012-05-16
相关资源
最近更新 更多