【问题标题】:Regular expression to replace everything with a blank, except for a pattern (dplyr, stringr)正则表达式用空白替换所有内容,模式除外(dplyr,stringr)
【发布时间】:2020-09-29 01:20:21
【问题描述】:

我有一个如下所示的数据框(示例数据):

myCars <- structure(list(Engine_Information = c("Ford 3.5L 6 Cylinder 355 hp 350 ft-lbs Turbo", 
                                  "Ford 5.4L 8 cylinder 310 hp 365 ft-lbs FFV", "Audi 3.0L 6 Cylinder 333 hp 325 ft-lbs S-charged", 
                                  "Toyota 2.7L 4 Cylinder 159 hp 180 ft-lbs", "Chevrolet 4.3L 6 Cylinder 195 hp 260 ft-lbs", 
                                  "Chevrolet 3.0L 6 Cylinder 264 hp 222 ft-lbs FFV", "GMC 3.7L 5 Cylinder 242 hp 242 ft-lbs", 
                                  "Volvo 3.2 L 6 cylinder 240 hp 236 ft-lbs", "Hyundai 2.4L 4 Cylinder 198 hp 184 ft-lbs", 
                                  "Mercedes-AMG 5.4L 8 Cylinder 500 hp 516 ft-lbs S-Charged")), 
      row.names = c(1074L, 1923L, 811L, 3378L, 2419L, 2080L, 2995L, 4889L, 1023L, 1368L), 
      class = "data.frame")

使用dplyrstringr,我想创建一个新列,其中 包含汽车的马力。

这是我(尝试)执行此操作的代码:

myCars_HP <- myCars %>%
  mutate(HP = Engine_Information) %>%
  mutate(HP = str_replace(HP, "^(?![0-9]{3}).*$", ""))

正则表达式模式背后的想法是将所有内容(在新列中)替换为空格,除了用于前三位数字(此数字是 HP)。

但是,我尝试过的每个正则表达式模式都只返回空白。

我想要的输出是:

我更喜欢使用 base R/dplyr/stringr 函数,所以如果有更有效的方法,请告诉我。

但最重要的是,我想知道为什么我的正则表达式不起作用,什么模式会起作用。

【问题讨论】:

    标签: r regex dplyr stringr


    【解决方案1】:

    您可以提取"hp"字符串之前的数字。

    在基础 R 中,您可以使用 sub

    myCars$hp <- as.numeric(sub('.*?(\\d+)\\shp.*', '\\1',myCars$Engine_Information))
    

    dplyr/stringr 使用正向前瞻正则表达式。

    library(dplyr)
    library(stringr)
    
    myCars %>%
        mutate(HP = as.numeric(str_extract(Engine_Information, '\\d+(?=\\shp)')))
    
    #                                         Engine_Information  HP
    #1              Ford 3.5L 6 Cylinder 355 hp 350 ft-lbs Turbo 355
    #2                Ford 5.4L 8 cylinder 310 hp 365 ft-lbs FFV 310
    #3          Audi 3.0L 6 Cylinder 333 hp 325 ft-lbs S-charged 333
    #4                  Toyota 2.7L 4 Cylinder 159 hp 180 ft-lbs 159
    #5               Chevrolet 4.3L 6 Cylinder 195 hp 260 ft-lbs 195
    #6           Chevrolet 3.0L 6 Cylinder 264 hp 222 ft-lbs FFV 264
    #7                     GMC 3.7L 5 Cylinder 242 hp 242 ft-lbs 242
    #8                  Volvo 3.2 L 6 cylinder 240 hp 236 ft-lbs 240
    #9                 Hyundai 2.4L 4 Cylinder 198 hp 184 ft-lbs 198
    #10 Mercedes-AMG 5.4L 8 Cylinder 500 hp 516 ft-lbs S-Charged 500
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2022-08-21
      相关资源
      最近更新 更多