Regex 如何在R中将两个字符之间的字符串拆分为子组

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 因此,通过这种方式,我可以将每个代码拆分为它的子代码,并将这些组件存储到同一个表中的新列中。

我在表的第二列中有一个代码列表,我想提取每个代码的一些元素,然后将它们存储在与每个代码关联的新列中。 每个代码由字母和数字组成。字母P、F、I、R、C在所有代码中以相同的顺序重复,但每个代码中的位数不同

例如:考虑下面的代码:

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