在软件包tidyr的“ separate”功能中指定分隔符

时间:2019-05-04 20:58:58

标签: r regex tidyr

我有一个小标题,其中有一列包含格式为XX_YY_ZZ的字符串。我需要使用 first 下划线作为分隔符,将该列分为两个个不同的列。

函数tidyr :: separate将匹配两个下划线,并在第二个之后删除该字符串。在Google上四处搜寻,发现正则表达式“ (?!。* )”仅与最后一个下划线匹配,但是我找不到与第一个下划线匹配的正则表达式。

我的数据如下:

d <- tibble(var = paste0(LETTERS[1:5], "_", 1:5, "_", letters[1:5])) 
d %>% separate(var, into=c("newcol1", "newcol2"))

# A tibble: 5 x 2
  newcol1 newcol2
  <chr>   <chr>  
1 A       1      
2 B       2      
3 C       3      
4 D       4      
5 E       5      
Warning message:
Expected 2 pieces. Additional pieces discarded in 5 rows [1, 2, 3, 4, 5]. 

我需要拥有的是:

# A tibble: 5 x 2
  newcol1 newcol2
  <chr>   <chr>  
1 A       1_a
2 B       2_b
3 C       3_c
4 D       4_d
5 E       5_e

2 个答案:

答案 0 :(得分:2)

1)指定extra = "merge"

d %>% 
  separate(var, into=c("newcol1", "newcol2"), extra = "merge", sep = "_")

2)或将第一个下划线替换为两个下划线,然后在其上进行分割。

d %>% 
  mutate(var = sub("_", "__", var)) %>% 
  separate(var, into=c("newcol1", "newcol2"), sep = "__")

3)或仅使用mutatesub而不是separate

d %>%
  mutate(newcol1 = sub("_.*", "", var), newcol2 = sub(".*?_", "", var), var = NULL)

答案 1 :(得分:0)

这是解决问题的一种方法。

d %>% separate(var, into = c("newcol1", "newcol2"), sep = "_(?=.*_)")

在这里,正则表达式_(?=.*_)的意思是:_后跟一个包含另一个_的字符串。

结果:

# A tibble: 5 x 2
  newcol1 newcol2
  <chr>   <chr>  
1 A       1_a    
2 B       2_b    
3 C       3_c    
4 D       4_d    
5 E       5_e   
相关问题