从R中的字符串集中提取模式

时间:2015-12-08 20:45:39

标签: r

我希望解析数据集并将其与我在R中已经制作的树匹配。我正在尝试简化提示标签以与我的系统发育树匹配。

例如来自“gi | 399148998 | gb | JN638572 |”并将其简化为“JN638572”(入藏号);我需要这样做61次(61个样本)。每个入藏号也从同一个位置开始。

## thanks for the data serban
set.seed(1)

mydat <- replicate(61, paste0(paste0(sample(letters,2), collapse=""),"|",
                              round(runif(1,1e8,1e9-1)),"|",
                              paste0(sample(letters,2), collapse=""),"|",
                              paste0(sample(LETTERS,2), collapse=""),
                              round(runif(1,1e6,1e7-1)),"|"))
head(mydat)
# [1] "gj|615568026|xf|XZ6947179|" "qb|285377117|er|JT5479293|" "sy|442031661|ux|FQ2129996|"
# [4] "gj|112051300|jv|IM6396092|" "me|844635986|rt|CS4701469|" "vq|804639485|on|UA5295070|"

1 个答案:

答案 0 :(得分:2)

我建议你不要在R中使用for循环。 R可以执行整个矢量操作。对于您的特定实例,应该这样做:

 library(stringr)
 #Generate some data: 
 mydat <- replicate(61, paste0(paste0(sample(letters,2), collapse=""),"|",
                                round(runif(1,1e8,1e9-1)),"|",
                                paste0(sample(letters,2), collapse=""),"|",
                                paste0(sample(LETTERS,2), collapse=""),
                                round(runif(1,1e6,1e7-1)),"|"))
head(mydat)
[1] "pg|451576916|kj|FV9562908|" "dt|707843618|sj|KZ3658708|" 
    "lb|507989738|lc|ML2309736|" "nb|448725577|fo|DW1950100|"
[5] "iv|337265231|us|CR5163970|" "ew|254260770|rw|LB2404167|"
 #Stuff you actually need:     
 results <- str_match(mydat, ".{2}\\|.*\\|.{2}\\|(.*)\\|")[,2]
 #Results:
 head(results)  
 [1] "FV9562908" "KZ3658708" "ML2309736" "DW1950100" "CR5163970" "LB2404167"

我正在使用正则表达式,它代表正则表达式。由于&#34;贪心&#34;它只适用".*\\|(.*)\\|"。口译员,但我已经让它变得更加复杂,以便更容易解释.{Nr}告诉它忽略Nr个字符,而.*告诉它忽略尽可能多的字符到达模式的下一部分,即\\||是一个特殊字符,必须&#34;转义&#34;使用\\,以便正则表达式处理器可以改为采用字面意思。括号是&#34;捕获组&#34;,即您想要返回的内容。

str_matchstringr库中的一个函数(您可能必须使用install.packages("stringr")安装),如果找到匹配项,它会在第一列中返回整个模式,然后下一列将成为第一个捕获组。我只使用[,2]表示法返回第二列。