【问题标题】:Separate string that contains "_"包含“_”的单独字符串
【发布时间】:2018-02-09 18:23:43
【问题描述】:

我有以下

ex <- tribble(
  ~type,
  "a__0",
  "ab__10"
)

> ex
type
a__0
ab__10

我想用“_”分隔。结果是

letter  extra
a       __0
ab      __10

注意双下划线

但是当我使用以下内容时

ex %>% separate(type,into=c("letter","extra"),sep = "_")

我明白了

letter  extra
a       
ab      

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    在第一个下划线前插入逗号,然后用逗号分隔:

    ex %>% 
       mutate(type = sub("_", ",_", type)) %>% 
       separate(type, into = c("letter", "extra"), sep = ",")
    

    给予:

    # A tibble: 2 x 2
      letter extra
    * <chr>  <chr>
    1 a      __0  
    2 ab     __10 
    

    【讨论】:

      【解决方案2】:

      这是另一个想法。将列分开,然后在后面加上__

      library(tidyverse)
      
      ex %>% 
        separate(type, into = c("letter", "extra")) %>%
        mutate(extra = paste0("__", extra))
      # # A tibble: 2 x 2
      #   letter extra
      #   <chr>  <chr>
      # 1 a      __0  
      # 2 ab     __10
      

      或将extract 与捕获组一起使用。

      ex %>%
        extract(type, into = c("letter", "extra"), regex = "([A-Za-z]+)(\\__[0-9]+)")
      # # A tibble: 2 x 2
      #   letter extra
      #   <chr>  <chr>
      # 1 a      __0  
      # 2 ab     __10 
      

      【讨论】:

      • 正则表达式 = "(.+)(__.+)"
      • @Nettle 感谢您的建议。不错。
      【解决方案3】:

      您也可以使用积极的前瞻:

      ex %>% separate(type,sep = "(?=_)", into = c("letter", "extra"), extra = "merge")
      

      【讨论】:

        【解决方案4】:

        str_split 在这里工作

        a <- do.call(rbind , strsplit( c("a__0","ab__10"), "__") )
        a[ , 2 ] <- paste0( "__", a[ , 2 ] )
        

        如果你不想要“__”而不是运行第二行

        【讨论】:

          猜你喜欢
          • 2019-05-01
          • 2016-09-08
          • 1970-01-01
          • 2018-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          相关资源
          最近更新 更多