用字符串最后出现的tidy分隔列

时间:2019-06-25 13:41:21

标签: r regex tidyverse tidyr

我有一列想要分开:

df <- tibble(
  variable = c("var_a_min", "var_ab_max", "var_abc_mean", "var_abcd_sd"),
  value = c(1,2,3,4)
)

数据如下:

# A tibble: 4 x 2
  variable     value
  <chr>        <dbl>
1 var_a_min        1
2 var_ab_max       2
3 var_abc_mean     3
4 var_abcd_sd      4

我想分隔variable列,以使最后一个下划线之后的内容成为第二列。

df %>% separate(variable, c("variable", "metric"), sep = [after last _])

我尝试了一些正则表达式,但无法弄清楚。数据应如下所示:

# A tibble: 4 x 3
  variable metric value
  <chr>    <chr>  <dbl>
1 var_a    min        1
2 var_ab   max        2
3 var_abc  mean       3
4 var_abcd sd         4

1 个答案:

答案 0 :(得分:4)

可以选择extract来将字符捕获为一个组。在第一个捕获组中,它是一个贪婪匹配((.*)-零个或多个字符),后跟一个_,在第二个组(([^_]+)$)中,匹配不匹配的字符_直到字符串($)的末尾。这样,可以确保第一个贪婪匹配回溯

library(tidyverse)
df %>% 
    extract(variable, into = c("variable", "metric"), "(.*)_([^_]+$)")

separate也可以使用正则表达式,因此如果前缀子字符串为'var',则可以使用

df %>% 
  separate(variable, into = c("variable", "metric"), "(?<!var)_")
# A tibble: 4 x 3
#  variable metric value
#  <chr>    <chr>  <dbl>
#1 var_a    min        1
#2 var_ab   max        2
#3 var_abc  mean       3
#4 var_abcd sd         4