Regex 如何在R中将两个字符之间的字符串拆分为子组
我在表的第二列中有一个代码列表,我想提取每个代码的一些元素,然后将它们存储在与每个代码关联的新列中。 每个代码由字母和数字组成。字母P、F、I、R、C在所有代码中以相同的顺序重复,但每个代码中的位数不同 例如:考虑下面的代码:Regex 如何在R中将两个字符之间的字符串拆分为子组,regex,r,matrix,split,extract,Regex,R,Matrix,Split,Extract,我在表的第二列中有一个代码列表,我想提取每个代码的一些元素,然后将它们存储在与每个代码关联的新列中。 每个代码由字母和数字组成。字母P、F、I、R、C在所有代码中以相同的顺序重复,但每个代码中的位数不同 例如:考虑下面的代码: P1F2I235R15C145 P1 F2 I23 R15 C145 P24F1I12R124C96 P24 F1 I12 R124 C96 因此,通过这种方式,我可以将每个代码拆分为它的子代码,并将这些组件存储到同一个表中的新列中。
P1F2I235R15C145 P1 F2 I23 R15 C145
P24F1I12R124C96 P24 F1 I12 R124 C96
因此,通过这种方式,我可以将每个代码拆分为它的子代码,并将这些组件存储到同一个表中的新列中。
谢谢试试这个:
#simulate your data frame
df<-data.frame(code=c("P1F2I235R15C145","P24F1I12R124C96"),stringsAsFactors=FALSE)
#split the columns
cbind(df,do.call(rbind,regmatches(df$code,gregexpr("[PFIRC][0-9]+",df$code))))
# code 1 2 3 4 5
#1 P1F2I235R15C145 P1 F2 I235 R15 C145
#2 P24F1I12R124C96 P24 F1 I12 R124 C96
#模拟您的数据帧
df这里有一个可能的stringi
解决方案
library(stringi)
x <- c("P1F2I235R15C145","P24F1I12R124C96")
res <- stri_split_regex(x,"(?=([A-Za-z]=?))",perl = TRUE,simplify = TRUE,omit_empty = TRUE)
cbind.data.frame(x, res)
# x 1 2 3 4 5
# 1 P1F2I235R15C145 P1 F2 I235 R15 C145
# 2 P24F1I12R124C96 P24 F1 I12 R124 C96
库(stringi)
xA数据。表
解决方案:
library(data.table)
dt<-data.table(code=c("P1F2I235R15C145","P24F1I12R124C96"))
dt[,c("P","F","I","R","C"):=
lapply(c("P","F","I","R","C"),
function(x)regmatches(code,regexpr(paste0(x,"[0-9]+"),code)))]
> dt
code P F I R C
1: P1F2I235R15C145 P1 F2 I235 R15 C145
2: P24F1I12R124C96 P24 F1 I12 R124 C96
如果字母总是以相同的顺序重复,那么您的数据中不存在高冗余吗?为什么不改用它们作为列名呢?子代码实际上是变量值(带有分类代码),所以我需要在请求时将它们存储在每个原始代码的前面。以P开头的所有值都是与变量P相关的度量值,而F之后的所有值都是与变量F相关的同一个体的度量值,依此类推。这两个选项都是Nicola+1:-)泰,非常感谢!感谢@Arun提供了完美的数据。表
解决了此问题,鉴于code
的格式是常规的,使用tstrsplit
非常有意义@阿伦:你能想出一个简单的调整方法,只拆分数字而不拆分字母吗?。
library(data.table)
dt<-data.table(code=c("P1F2I235R15C145","P24F1I12R124C96"))
dt[,c("P","F","I","R","C"):=
lapply(c("P","F","I","R","C"),
function(x)regmatches(code,regexpr(paste0(x,"[0-9]+"),code)))]
> dt
code P F I R C
1: P1F2I235R15C145 P1 F2 I235 R15 C145
2: P24F1I12R124C96 P24 F1 I12 R124 C96
dt[,c("P","F","I","R","C"):=
lapply(c("P","F","I","R","C"),
function(x)regmatches(code,regexpr(paste0("(?<=",x,")[0-9]+"),
code,perl=T)))]
> dt
code P F I R C
1: P1F2I235R15C145 1 2 235 15 145
2: P24F1I12R124C96 24 1 12 124 96
dt[, c("P", "F", "I", "R", "C") :=
tstrsplit(code, "(?<=.)(?=[[:alpha:]][0-9]+)", perl=TRUE)]
# code P F I R C
# 1: P1F2I235R15C145 P1 F2 I235 R15 C145
# 2: P24F1I12R124C96 P24 F1 I12 R124 C96