正则表达式用空白替换所有内容,模式除外 (dplyr, stringr)
Regular expression to replace everything with a blank, except for a pattern (dplyr, stringr)
我有一个看起来像这样的数据框(示例数据):
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")
使用 dplyr
和 stringr
,我想创建一个包含 仅 汽车马力的新列。
这是我(尝试)执行此操作的代码:
myCars_HP <- myCars %>%
mutate(HP = Engine_Information) %>%
mutate(HP = str_replace(HP, "^(?![0-9]{3}).*$", ""))
正则表达式模式背后的想法是用空格替换所有内容(在新列中),除了 用于第一个三位数(这个数字是 HP)。
但是,我尝试过的每个正则表达式模式都只是 returns 个空白。
我想要的输出是:
我更喜欢 base R
/dplyr
/stringr
函数,如果有更有效的方法,请告诉我。
但最重要的是,我想知道为什么我的正则表达式不起作用,以及哪种模式会起作用。
您可以提取 "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
我有一个看起来像这样的数据框(示例数据):
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")
使用 dplyr
和 stringr
,我想创建一个包含 仅 汽车马力的新列。
这是我(尝试)执行此操作的代码:
myCars_HP <- myCars %>%
mutate(HP = Engine_Information) %>%
mutate(HP = str_replace(HP, "^(?![0-9]{3}).*$", ""))
正则表达式模式背后的想法是用空格替换所有内容(在新列中),除了 用于第一个三位数(这个数字是 HP)。
但是,我尝试过的每个正则表达式模式都只是 returns 个空白。
我想要的输出是:
我更喜欢 base R
/dplyr
/stringr
函数,如果有更有效的方法,请告诉我。
但最重要的是,我想知道为什么我的正则表达式不起作用,以及哪种模式会起作用。
您可以提取 "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