【问题标题】:Separate column with tidyr by last occurance of string按最后一次出现的字符串用 tidyr 分隔列
【发布时间】:2019-11-07 09:00:44
【问题描述】:

我有一个栏目要分开:

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

【问题讨论】:

    标签: r regex tidyverse tidyr


    【解决方案1】:

    一个选项是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
    

    【讨论】:

    • 做到了。 separateextract 有什么区别?
    • @broesel23 separate 在提供的分隔符上拆分。这里是_,但是我们指定_的位置,指定它后面不应该跟'var'。在extract 中,我们正在捕获字符并丢弃那些不想出现在输出中的字符
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2019-01-06
    • 2011-11-13
    • 1970-01-01
    • 2014-10-08
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多