在第一个数字处拆分字符串

时间:2013-11-04 06:45:06

标签: regex string r

我想在最后一个字母和第一个数字之间拆分字符串:

dat <- read.table(text = "
        x         y    
        a1        0.1
        a2        0.2
        a3        0.3
        a4        0.4
        df1       0.1
        df2       0.2
        df13      0.3
        df24      0.4
        fcs111    0.1
        fcs912    0.2
        fcs113    0.3
        fcsb8114  0.4", 
 header=TRUE, stringsAsFactors=FALSE)

desired.result <- read.table(text = "
        x1    x2     y    
        a     1      0.1
        a     2      0.2
        a     3      0.3
        a     4      0.4
        df    1      0.1
        df    2      0.2
        df    13     0.3
        df    24     0.4
        fcs   111    0.1
        fcs   912    0.2
        fcs   113    0.3
        fcsb  8114   0.4", 
 header=TRUE, stringsAsFactors=FALSE)

StackOverflow上有很多类似的问题,但我找不到这种确切的情况。我知道这一定是个基本问题。如果我花了几个小时,我可能会想出来。抱歉。谢谢你的任何建议。我更喜欢基地R.如果这是重复我可以删除它。

4 个答案:

答案 0 :(得分:5)

您可以使用外观:

(?<=[a-zA-Z])(?=[0-9])

答案 1 :(得分:4)

您可以使用strsplit函数并为split参数

提供正则表达式模式
cbind(dat, do.call(rbind, strsplit(dat$x, split = "(?<=[a-zA-Z])(?=[0-9])", perl = T)))
##           x   y    1    2
## 1        a1 0.1    a    1
## 2        a2 0.2    a    2
## 3        a3 0.3    a    3
## 4        a4 0.4    a    4
## 5       df1 0.1   df    1
## 6       df2 0.2   df    2
## 7      df13 0.3   df   13
## 8      df24 0.4   df   24
## 9    fcs111 0.1  fcs  111
## 10   fcs912 0.2  fcs  912
## 11   fcs113 0.3  fcs  113
## 12 fcsb8114 0.4 fcsb 8114

答案 2 :(得分:2)

使用gsubstrsplit的方法:

data.frame(do.call(rbind, strsplit(gsub("([a-zA-Z])([0-9])", "\\1_\\2", 
    dat$x), "_")), y = dat$y)

##      X1   X2   y
## 1     a    1 0.1
## 2     a    2 0.2
## 3     a    3 0.3
## 4     a    4 0.4
## 5    df    1 0.1
## 6    df    2 0.2
## 7    df   13 0.3
## 8    df   24 0.4
## 9   fcs  111 0.1
## 10  fcs  912 0.2
## 11  fcs  113 0.3
## 12 fcsb 8114 0.4

显示每个阶段发生的事情:

(a <- gsub("([a-zA-Z])([0-9])", "\\1_\\2", dat$x))
(b <- strsplit(a, "_"))
(d <- do.call(rbind, b))
data.frame(d, y = dat$y)

答案 3 :(得分:1)

stringr包使其更具可读性。在以下示例中,[[:alpha:]][[:digit:]]分别是字母和数字的与语言环境无关的字符类。

library(stringr)
matches <- str_match(dat$x, "([[:alpha:]]+)([[:digit:]])")
desired.result <- data.frame(
  x1 = matches[, 2], 
  x2 = as.numeric(matches[, 3]), 
  y  = dat$y
)