加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 基于正则表达式创建新变量

发布时间:2020-12-14 06:32:46 所属栏目:百科 来源:网络整理
导读:我的问题涉及如何根据正则表达式的结果在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","Leg
我的问题涉及如何根据正则表达式的结果在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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读