使用带有多个分隔符的strsplit

时间:2017-12-12 13:12:46

标签: r regex strsplit

如何拆分

 Chr3:153922357-153944632(-)
 Chr11:70010183-70015411(-)   

进入

    Chr3  153922357 153944632 - 
    Chr11 70010183  70015411  -   

我尝试了strsplit(df$V1,"[[:punct:]]")),但负号未出现在最终结果中

3 个答案:

答案 0 :(得分:2)

问题是-既是要提取的字符,也是分隔符。您最好的选择是使用捕获组并指定完整的正则表达式字符串:

stringr::str_match(x, "^(.{4}):(\\d+)-(\\d+)\\((.)\\)$")

编辑:如果您想让第一个捕获组捕获任意长度的字符串(例如,任何X的ChrX),您可以将第一个捕获组从.{4}更改为Chr\\d+

答案 1 :(得分:2)

使用stringsplitgsub

在基地R中这样做
# Your sample strings
ss <- c("Chr3:153922357-153944632(-)",
        "Chr11:70010183-70015411(-)")

# Split items as list of vectors 
lst <- lapply(ss, function(x)
    unlist(strsplit(gsub("(.+):(\\d+)-(\\d+)\\((.)\\)", "\\1,\\2,\\3,\\4", x), ",")))


# rbind to dataframe if necessary
do.call(rbind, lst);
#    [,1]    [,2]        [,3]        [,4]
#[1,] "Chr3"  "153922357" "153944632" "-"
#[2,] "Chr11" "70010183"  "70015411"  "-"

这也适用于其他染色体名称和正链特征。

答案 2 :(得分:1)

您还可以尝试myPromise2()中的str_split

stringr

<强>结果:

library(stringr)
lapply(str_split(df$V1, "(?<!\\()\\-|[:\\)\\(]"), function(x) x[x != ""])

数据:

[[1]]
[1] "Chr3"      "153922357" "153944632" "-"        

[[2]]
[1] "Chr11"    "70010183" "70015411" "-"