如何将相应的值匹配到字符串的一部分(space之前和之后)?

How to match corresponding values to part of string (before and after space)?

我有两个数据框,想根据字符串值将第二个数据框的值添加到第一个数据框,但是如果有 space

则使用部分字符串匹配
df1:
cat
small dog
apple

df2:
cat  24
small 5
dog  400
apple 83
pear 55


我通常使用 tidyverse 中的“left_join”,即

df3 <- left_join(df1, df2, by="column_name")

df3:
cat 24
small dog NA
apple 83

但这意味着“small dog”有缺失值。这次我想做的是找到“small”或“dog”的值,然后输入较大的一个。尽管

,但我无法找到一个函数来告诉 R 在 space 之前或之后分别查看

我们可以使用 fuzzyjoin 中的 regex_left_join,然后对 summarise 第二列进行分组 max

library(dplyr)
library(fuzzyjoin)
regex_left_join(df1, df2, by = "column_name") %>% 
 group_by(column_name = column_name.x) %>% 
 summarise(col2 = max(col2))

-输出

# A tibble: 3 × 2
  column_name  col2
  <chr>       <dbl>
1 apple          83
2 cat            24
3 small dog     400

数据

df1 <- structure(list(column_name = c("cat", "small dog", "apple")), 
class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(column_name = c("cat", "small", "dog", "apple", 
"pear"), col2 = c(24, 5, 400, 83, 55)), class = "data.frame", row.names = c(NA, 
-5L))

另一种可能的解决方案,基于inner_join

library(tidyverse)

df1 %>% 
  mutate(spaces = row_number()*str_detect(column_name, " ")) %>% 
  separate_rows(column_name, sep = " ") %>% 
  inner_join(df2, by="column_name") %>% 
  group_by(spaces) %>% 
  mutate(col2 = if_else(spaces > 0, max(col2), col2),
         column_name = if_else(spaces > 0, str_c(column_name, collapse = " "), 
                       column_name)) %>% 
  ungroup %>% distinct %>% select(-spaces)

#> # A tibble: 3 × 2
#>   column_name  col2
#>   <chr>       <dbl>
#> 1 cat            24
#> 2 small dog     400
#> 3 apple          83