包含“_”

时间:2018-02-09 18:23:44

标签: r dplyr tidyr

我有以下

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      

4 个答案:

答案 0 :(得分:4)

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

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 

答案 1 :(得分: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 

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

str_split在这里工作

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

如果你不想要&#34; __&#34;而不是不运行第二行