用于匹配矩阵上的列名的正则表达式

时间:2014-08-07 14:16:18

标签: regex r

我有两个形式的字符串

  1. " Initestimate"或" L#估计" #是1位或2位数

  2. " Nameestimate" 名称是实际符号的名称。在下面的示例中,我们的符号名称为" 6JU4"

  3. 我有一个矩阵,其中包含包含" InitSymbol"的列。和" L#符号"。我想在"估计"之前返回第一行包含子字符串的列的列名。 我使用的是stringr。现在我用str_sub的一堆调用编码,但它真的很草率,我想清理它并做正确的事。 示例代码:

    > examplemat <- matrix(c("RYU4","6JU4","6EU4",1,2,3),ncol=6)
    > colnames(examplemat) <- c("InitSymb","L1Symb","L2Symb","RYU4estimate","6JU4estimate","6EU4estimate")
    > examplemat
         InitSymb   L1Symb      L2Symb      RYU4estimate 6JU4estimate 6EU4estimate
    [1,] "RYU4"     "6JU4"      "6EU4"          "1"          "2"           "3" 
    > searchStr <- "L1estimate"
    

    因此,回答是我正在寻找的答案,我希望能够输入examplemat [, answer ],这样我就可以提取数据列了(在这种情况下,&#34; 2&#34;)

    我真的不知道怎么做正则表达式,但我认为答案看起来像

    examplemat[,paste0(**some regex function**("[(Init)|(L[:digit:]+)]",searchStr),"estimate")]
    

    那里有什么功能,是我的正则表达式代码吗?

3 个答案:

答案 0 :(得分:1)

可能你可以试试:

library(stringr) 
Extr <- str_extract(searchStr, '^[A-Za-z]\\d+')
Extr
[1] "L1"

#If the searchStr is `Initestimate`
#Extr <- str_extract(searchStr, '^[A-Za-z]{4}') 

pat1 <- paste0("(?<=",Extr,").*")
indx1 <-examplemat[,str_detect(colnames(examplemat),perl(pat1))]
pat2 <- paste0("(?<=",indx1,").*")

examplemat[,str_detect(colnames(examplemat), perl(pat2))]
#6JU4estimate 
#     "2" 

#For searchStr using Initestimate;
#examplemat[,str_detect(colnames(examplemat), perl(pat2))]
#RYU4estimate 
 #    "1" 

答案 1 :(得分:0)

问题有点令人困惑,所以我不确定我的解释是否正确。

首先,您将在没有“Symb”的字符串“coolSymb”中提取值 其次,您可以检测列名是否包含“cool”并返回位置(列索引) 由哪个()声明。 最后,您可以使用简单的矩阵索引提取值。

library(stringr)
a = str_split("coolSymb", "Symb")[[1]][1]
b = which(str_detect(colnames(examplemat), a))
examplemat[1, b]

希望这有帮助,

答案 2 :(得分:0)

won782使用str_split激发了我找到一个有效的答案,虽然我仍然想知道如何通过匹配前缀而不是排除后缀来做到这一点,所以我会接受这样做的答案。 这是一步一步的

> str_split("L1estimate","estimate")[[1]][1]
[1] "L1"

将上述步骤替换为获得{L1}而不是获得{not estimate}奖励积分

的步骤
> paste0(str_split("L1estimate","estimate")[[1]][1],"Symb")
[1] "L1Symb"
> examplemat[1,paste0(str_split("L1estimate","estimate")[[1]][1],"Symb")]
     L1Symb
[1,] "6JU4"
> paste0(examplemat[1,paste0(str_split("L1estimate","estimate")[[1]][1],"Symb")],"estimate")
[1] "6JU4estimate"
> examplemat[,paste0(examplemat[1,paste0(str_split("L1estimate","estimate")[[1]][1],"Symb")],"estimate")]
     6JU4estimate
[1,] "2"