【问题标题】:R split string at last whitespace chars using tidyr::separateR 使用 tidyr::separate 在最后一个空格字符处拆分字符串
【发布时间】:2015-11-14 04:43:39
【问题描述】:

假设我有一个这样的数据框:

df<-data.frame(a=c("AA","BB"),b=c("short string","this is the longer string"))

我想根据最后出现的空格使用正则表达式拆分每个字符串。 我试过了:

library(dplyr)
library(tidyr)
df%>%
  separate(b,c("partA","partB"),sep=" [^ ]*$")

但这省略了输出中字符串的第二部分。我想要的输出如下所示:

   a              partA  partB
1 AA              short string
2 BB this is the longer string

我该怎么做。如果我可以为此使用 tidyr 和 dplyr 那就太好了。

【问题讨论】:

    标签: regex r dplyr tidyr


    【解决方案1】:

    我们可以通过捕获组 ((...)) 使用来自 tidyrextract。我们匹配零个或多个字符 (.*) 并将其放在括号内 ((.*)),然后是零个或多个空格 (\\s+),然后是下一个捕获组,其中仅包含非空格字符([^ ]) 直到字符串的结尾 ($)。

    library(tidyr)
    extract(df, b, into = c('partA', 'partB'), '(.*)\\s+([^ ]+)$')
    #   a              partA  partB
    #1 AA              short string
    #2 BB this is the longer string
    

    【讨论】:

      【解决方案2】:

      您可以将正则表达式的[^ ]*$ 部分转换为(?=[^ ]*$) 非消耗模式,positive lookahead(不会消耗字符串末尾的非空白字符,即它们不会被放入匹配值中,因此将留在输出中):

      df%>%
        separate(b,c("partA","partB"),sep=" (?=[^ ]*$)")
      

      或者,更通用一点,因为它匹配任何空白字符:

      df %>%
        separate(b,c("partA","partB"),sep="\\s+(?=\\S*$)")
      

      查看regex demo 及其下图:

      输出:

         a              partA  partB
      1 AA              short string
      2 BB this is the longer string
      

      【讨论】:

        猜你喜欢
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 2019-06-11
        • 2012-01-08
        • 2013-04-19
        • 2013-01-01
        • 1970-01-01
        相关资源
        最近更新 更多