【问题标题】:Use strsplit with multiple delimiters [duplicate]使用带有多个分隔符的 strsplit [重复]
【发布时间】:2018-05-26 04:39:19
【问题描述】:

我该如何拆分这个

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

进入

    Chr3  153922357 153944632 - 
    Chr11 70010183  70015411  -   

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

【问题讨论】:

  • (我想)我不小心删除了下面的有效帖子(不是我的)!我最深切的歉意!我不记得是谁了。我将此标记为 mod 的注意以取消删除。
  • 您只想在第一次出现- 时进行拆分。也许here的一些答案可能会有所帮助

标签: r regex strsplit


【解决方案1】:

你也可以从stringr尝试str_split

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(-) ")

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果我使用 stringr::str_match(x, "^(.{4}):(\\d+)-(\\d+)\((.)\)$"),则第二行越来越不适用
    • 正则表达式应涵盖 ChrNNA 的情况,即:chr1、chr12、chrX。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      相关资源
      最近更新 更多