【问题标题】:Split string on both sides of a number在数字的两侧拆分字符串
【发布时间】:2023-03-12 11:31:01
【问题描述】:

假设我们有这样的字符串:

data
X3Y
X33U
Y231Z

我想将data分成三列first.letternumberlast.letter,所以在这种情况下:

first.letter number last.letter
X            3      Y
X            33     U
Y            231    Z

我可以使用substr 提取列值的第一个和最后一个字符,然后使用正则表达式来提取数字,但这似乎很麻烦,有没有更快的方法来实现这一点?

【问题讨论】:

  • 浏览标记为rregex 的帖子可能有助于找到相关问题,例如this one

标签: r split strsplit


【解决方案1】:

一个选项是extract 来自tidyr

library(tidyr)
library(dplyr)
df1 %>%
    extract(data, into = c("first.letter", "number", "last.letter"),
            "^([A-Z])(\\d+)([A-Z])$")
#  first.letter number last.letter
#1            X      3           Y
#2            X     33           U
#3            Y    231           Z

separate

df1 %>%
  separate(data, into = c("first.letter", "number", "last.letter"), 
         sep= "(?<=[A-Z])(?=[0-9])|(?<=[0-9])(?=[A-Z])")
#   first.letter number last.letter
#1            X      3           Y
#2            X     33           U
#3            Y    231           Z

或者另一个选项是strsplit,然后是rbind

do.call(rbind, strsplit(df1$data, 
        "(?<=[A-Z])(?=[0-9])|(?<=[0-9])(?=[A-Z])", perl = TRUE))

数据

df1 <- structure(list(data = c("X3Y", "X33U", "Y231Z")), 
   class = "data.frame", row.names = c(NA, -3L))

【讨论】:

    【解决方案2】:

    使用data.table

    setDT(df)
    df[, tstrsplit(sub("([0-9]+)", "_\\1_", data) , "_")]
    
    
       V1  V2 V3
    1:  X   3  Y
    2:  X  33  U
    3:  Y 231  Z
    

    【讨论】:

      【解决方案3】:

      一个最小正则表达式的想法可以是,

      i1 <- gsub('\\D+', '', df1$data)
      i2 <- strsplit(df1$data, '\\d+')
      
      setNames(data.frame(t(mapply(c, i2,i1))), c('first_letter', 'second_letter', 'number'))
      
      #  first_letter second_letter number
      #1            X             Y      3
      #2            X             U     33
      #3            Y             Z    231
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2018-01-06
        • 2014-08-06
        • 2023-03-24
        相关资源
        最近更新 更多