使用带有多个定界符的 strsplit

Use strsplit with multiple delimiters

我怎么拆分这个

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

    Chr3  153922357 153944632 - 
    Chr11 70010183  70015411  -   

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

问题是 - 既是您要提取的字符又是定界符。最好的办法是使用捕获组并指定完整的正则表达式字符串:

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

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

使用 stringsplitgsub 在 base 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"  "-"

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

您也可以尝试 str_split 来自 stringr:

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

结果:

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

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

数据:

df = read.table(text = " Chr3:153922357-153944632(-)
 Chr11:70010183-70015411(-) ")