我的问题涉及如何根据正则表达式的结果在R的数据框架上创建一个新的变量。
以下是数据的最小例证:
以下是数据的最小例证:
df <- data.frame(model=c("Legacy 2.0 BG5 B4 AUTO","Legacy 2.0 BH5 AT","Legacy 2.0i CVT Non Leather","Legacy 2.0i CVT","Legacy 2.0 BL5 AUTO B4","Legacy 2.0 BP5 AUTO","Legacy 2.0 BM5 AUTO CVT"),CRSP=c(3450000,3365000,4950000,5250000,4787526,3550000,5235000)) df model CRSP 1 Legacy 2.0 BG5 B4 AUTO 3450000 2 Legacy 2.0 BH5 AT 3365000 3 Legacy 2.0i CVT Non Leather 4950000 4 Legacy 2.0i CVT 5250000 5 Legacy 2.0 BL5 AUTO B4 4787526 6 Legacy 2.0 BP5 AUTO 3550000 7 Legacy 2.0 BM5 AUTO CVT 5235000
我想创建一个新的变量’chassis’,其值是相应的’model’变量字符串的第三个元素,结果是:
df model CRSP chassis 1 Legacy 2.0 BG5 B4 AUTO 3450000 BG5 2 Legacy 2.0 BH5 AT 3365000 BH5 3 Legacy 2.0i CVT Non Leather 4950000 CVT 4 Legacy 2.0i CVT 5250000 CVT 5 Legacy 2.0 BL5 AUTO B4 4787526 BL5 6 Legacy 2.0 BP5 AUTO 3550000 BP5 7 Legacy 2.0 BM5 AUTO CVT 5235000 BM5
对于这种任务,我是tidyr的大粉丝,将所有的部分提取到单独的列中:
if (!require("pacman")) install.packages("pacman") pacman::p_load(dplyr,tidyr) regx <- "(^[A-Za-z]+\\s+[0-9.a-z]+)\\s+([A-Z0-9]+)\\s*(.*)" df %>% extract(model,c("a","chassis","b"),regx,remove=FALSE) ## model a chassis b CRSP ## 1 Legacy 2.0 BG5 B4 AUTO Legacy 2.0 BG5 B4 AUTO 3450000 ## 2 Legacy 2.0 BH5 AT Legacy 2.0 BH5 AT 3365000 ## 3 Legacy 2.0i CVT Non Leather Legacy 2.0i CVT Non Leather 4950000 ## 4 Legacy 2.0i CVT Legacy 2.0i CVT 5250000 ## 5 Legacy 2.0 BL5 AUTO B4 Legacy 2.0 BL5 AUTO B4 4787526 ## 6 Legacy 2.0 BP5 AUTO Legacy 2.0 BP5 AUTO 3550000 ## 7 Legacy 2.0 BM5 AUTO CVT Legacy 2.0 BM5 AUTO CVT 5235000
您可以使用这个正则表达式更通用:
regx <- "(^[^ ]+\\s+[^ ]+)\\s+([^ ]+)\\s*(.*)"
另请注意,您可以使用提取来获取您之前的列,如下所示删除第一组和最后一个组上的分组括号:
regx <- "^[A-Za-z]+\\s+[0-9.a-z]+\\s+([A-Z0-9]+)\\s*.*" df %>% extract(model,remove=FALSE)