【问题标题】:Separate column on the last digit最后一位数字的单独列
【发布时间】:2021-06-23 21:48:28
【问题描述】:

假设我有一个像这样的 df:

x <- data.frame("SN" = 1:3, "Age" = c(21,15,2), "Name" = c("Q62yes","Q44_1_1Maybe", "Q2Some times"))

我想将名称列分开,这样:

x_out <- data.frame("SN" = 1:3, "Age" = c(21,15,2), "Name" = c("Q62","Q44_1_1","Q2"), "New" = c("yes", 'Maybe', 'some times'))

我试过这个,但我不认为我的正则表达式没有按预期将它分成两组。有什么建议吗?

x %>% 
  tidyr::separate(Name,c("name",'new'), sep = "(Q[[:digit:]]*_[[:digit:]])*([[:alpha:]]*\\s*)")

【问题讨论】:

    标签: r regex


    【解决方案1】:

    你可以使用

    x %>% 
       tidyr::extract(Name,c("name",'new'), "(.*?\\d)([[:alpha:]].*)")
    

    正则表达式的意思是:

    • (.*?\d) - 第 1 组:任何零个或多个字符尽可能少,直到后面的子模式跟随的数字
    • ([[:alpha:]].*) - 第 2 组:一个字母,然后是字符串的其余部分。

    请参阅regex demo

    带输出的 R 测试:

    > x %>% 
    +   tidyr::extract(Name,c("name",'new'), "(.*?\\d)([[:alpha:]].*)")
      SN Age    name        new
    1  1  21     Q62        yes
    2  2  15 Q44_1_1      Maybe
    3  3   2      Q2 Some times
    

    【讨论】:

    • 谢谢,我不知道你可以用 extract 做!
    • @NewBee 使用extract 更安全。假设您有Q62iphone11new,它将被拆分多次,列数将不再匹配。
    【解决方案2】:

    我们可以使用正则表达式环视在separate 中的数字 (\\d) 和非数字 ([A-Za-z]) 之间进行拆分

    library(tidyr)
    library(dplyr)
    x %>% 
        separate(Name, into = c("Name", "New"), sep="(?<=\\d)(?=[A-Za-z])")
    

    -输出

    SN Age    Name        New
    1  1  21     Q62        yes
    2  2  15 Q44_1_1      Maybe
    3  3   2      Q2 Some times
    

    请注意,与extract相比,当我们没有数字时,这也可以工作

    x$Name[3] <- "hello"
    

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 2019-05-20
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多