我想在最后一个字母和第一个数字之间拆分字符串:
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.如果这是重复我可以删除它。
答案 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)
使用gsub
和strsplit
的方法:
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
)