使用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

我的直觉是使用函数greplstr_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))