使用R匹配数据框中的复杂字符串名称
matching complex strings names in data frame using R
我有两个数据框:
name1 name2
AaI08 BbZ09
AaB65 BbX02
第二个带有代码(省略开头的 Aa 或 Bb),其中包含描述:
Code meaning
I08 Volvo
B65 Seat
Z093 BMW
X021 Fiat
我想匹配第二个数据框的字母后的前两个数字,并将其带到第一个数据框。最终结果应如下所示:
name1 name2
Volvo BMW
Seat Fiat
我的直觉是使用函数grepl
和str_extract(code, '[A-Z]\d{2}')
分别匹配和收集字母后的前两个数字。
从字符串中删除前两个字符,然后执行连接。
library(dplyr)
df1 %>%
mutate(Code = sub('..', '', name1)) %>%
#If you want to remove initial Aa or Bb
#mutate(Code = sub('^(Aa|Bb)', '', name1)) %>%
inner_join(df2, by = 'Code')
# Code name1 name2 meaning
#1 B65 AaB65 BbX02 Seat
#2 I08 AaI08 BbZ09 Volvo
在基数 R 中:
merge(transform(df1, Code = sub('..', '', name1)), df2, by = 'Code')
使用基数 R:
sapply(d1, function(x) d2$meaning[match(substr(x,4,5),substr(d2$Code,2,3))]) %>% as.data.frame()
name1 name2
1 Volvo BMW
2 Seat Fiat
使用的数据:
d1
# A tibble: 2 x 2
name1 name2
<chr> <chr>
1 AaI08 BbZ09
2 AaB65 BbX02
d2
# A tibble: 4 x 2
Code meaning
<chr> <chr>
1 I08 Volvo
2 B65 Seat
3 Z093 BMW
4 X021 Fiat
使用 gsub
和正则表达式。
f <- function(x) gsub("\D+?(\d{2}).*", "\1", x)
sapply(dat1, function(x) dat2$meaning[match(f(x), f(dat2$Code))])
# name1 name2
# [1,] "Volvo" "BMW"
# [2,] "Seat" "Fiat"
数据:
dat1 <- structure(list(name1 = c("AaI08", "AaB65"), name2 = c("BbZ09",
"BbX02")), class = "data.frame", row.names = c(NA, -2L))
dat2 <- structure(list(Code = c("I08", "B65", "Z093", "X021"), meaning = c("Volvo",
"Seat", "BMW", "Fiat")), class = "data.frame", row.names = c(NA,
-4L))
我有两个数据框:
name1 name2
AaI08 BbZ09
AaB65 BbX02
第二个带有代码(省略开头的 Aa 或 Bb),其中包含描述:
Code meaning
I08 Volvo
B65 Seat
Z093 BMW
X021 Fiat
我想匹配第二个数据框的字母后的前两个数字,并将其带到第一个数据框。最终结果应如下所示:
name1 name2
Volvo BMW
Seat Fiat
我的直觉是使用函数grepl
和str_extract(code, '[A-Z]\d{2}')
分别匹配和收集字母后的前两个数字。
从字符串中删除前两个字符,然后执行连接。
library(dplyr)
df1 %>%
mutate(Code = sub('..', '', name1)) %>%
#If you want to remove initial Aa or Bb
#mutate(Code = sub('^(Aa|Bb)', '', name1)) %>%
inner_join(df2, by = 'Code')
# Code name1 name2 meaning
#1 B65 AaB65 BbX02 Seat
#2 I08 AaI08 BbZ09 Volvo
在基数 R 中:
merge(transform(df1, Code = sub('..', '', name1)), df2, by = 'Code')
使用基数 R:
sapply(d1, function(x) d2$meaning[match(substr(x,4,5),substr(d2$Code,2,3))]) %>% as.data.frame()
name1 name2
1 Volvo BMW
2 Seat Fiat
使用的数据:
d1
# A tibble: 2 x 2
name1 name2
<chr> <chr>
1 AaI08 BbZ09
2 AaB65 BbX02
d2
# A tibble: 4 x 2
Code meaning
<chr> <chr>
1 I08 Volvo
2 B65 Seat
3 Z093 BMW
4 X021 Fiat
使用 gsub
和正则表达式。
f <- function(x) gsub("\D+?(\d{2}).*", "\1", x)
sapply(dat1, function(x) dat2$meaning[match(f(x), f(dat2$Code))])
# name1 name2
# [1,] "Volvo" "BMW"
# [2,] "Seat" "Fiat"
数据:
dat1 <- structure(list(name1 = c("AaI08", "AaB65"), name2 = c("BbZ09",
"BbX02")), class = "data.frame", row.names = c(NA, -2L))
dat2 <- structure(list(Code = c("I08", "B65", "Z093", "X021"), meaning = c("Volvo",
"Seat", "BMW", "Fiat")), class = "data.frame", row.names = c(NA,
-4L))