前端之家收集整理的这篇文章主要介绍了
正则表达式 – 基于正则表达式创建新变量,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
404_0@
我的问题涉及如何根据正则表达式的结果在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)