R 在case_中使用map2替换字符串

R 在case_中使用map2替换字符串,r,dplyr,purrr,R,Dplyr,Purrr,我有一个2列tible,replace\u tbl,其中有一个模式向量和一个替换向量。我想使用这些列中的值在不同的TIBLE中创建一个新变量,df,对于df中的每一行,该变量将循环通过replace\u tbl$pat的值,如果检测到,将替换为replace\u tbl$replace。如果未检测到图案,则应返回NA 我的感觉是我应该结合使用mutate(),map2(),和case\u when(),但我想不出来。基本上,我想做下面的代码完成的事情,但不必重复多次调用str\u detect(

我有一个2列tible,
replace\u tbl
,其中有一个模式向量和一个替换向量。我想使用这些列中的值在不同的TIBLE中创建一个新变量,
df
,对于
df
中的每一行,该变量将循环通过
replace\u tbl$pat
的值,如果检测到,将替换为
replace\u tbl$replace
。如果未检测到图案,则应返回
NA

我的感觉是我应该结合使用
mutate()
map2()
,和
case\u when()
,但我想不出来。基本上,我想做下面的代码完成的事情,但不必重复多次调用
str\u detect()

library(tidyverse)

replace_tbl <- tibble(
  pattern = c("Ideal|Premium", "Very Good"),
  replace = c("Apple", "Banana")
)

#what I want to replicate
diamonds %>%
  mutate(new_var = case_when(
    str_detect(cut, replace_tbl$pattern[[1]]) ~ replace_tbl$replace[[1]],
    str_detect(cut, replace_tbl$pattern[[2]]) ~ replace_tbl$replace[[2]],
    TRUE ~ NA_character_
  )) %>%
  head()

# A tibble: 6 x 11
  carat cut       color clarity depth table price     x     y     z new_var
  <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr>  
1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43 Apple  
2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31 Apple  
3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31 NA     
4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63 Apple  
5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75 NA     
6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48 Banana 
库(tidyverse)
替换tbl%
变异(新变量=情况)(
str_detect(剪切、替换_tbl$pattern[[1]])~replace_tbl$replace[[1]],
str_detect(剪切、替换_tbl$pattern[[2]])~replace_tbl$replace[[2]],
真~NA_性格_
)) %>%
总目()
#一个tibble:6x11
克拉切割颜色清晰度深度表价格x y z新
1 0.23理想E SI2 61.5 55 326 3.95 3.98 2.43苹果
2 0.21优质E SI1 59.8 61 326 3.89 3.84 2.31苹果
3 0.23良好E VS1 56.9 65 327 4.05 4.07 2.31 NA
4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63苹果
5 0.31良好J SI2 63.3 58 335 4.34 4.35 2.75 NA
6 0.24非常好J VVS2 62.8 57 336 3.94 3.96 2.48香蕉

您可以使用fuzzyjoin软件包:

library(fuzzyjoin)
diamonds %>%
  as_tibble() %>% 
  regex_left_join(replace_tbl, by = c(cut = "pattern"))

# A tibble: 53,940 x 12
   carat cut       color clarity depth table price     x     y     z pattern       replace
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr>         <chr>  
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43 Ideal|Premium Apple  
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31 Ideal|Premium Apple  
 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31 NA            NA     
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63 Ideal|Premium Apple  
 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75 NA            NA     
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48 Very Good     Banana 
库(fuzzyjoin)
钻石%>%
as_tible()%>%
regex\u left\u join(用=c(cut=“pattern”)替换\u tbl)
#A tibble:53940 x 12
克拉切割颜色清晰度深度表价格x y z图案替换
1 0.23理想E SI2 61.5 55 326 3.95 3.98 2.43理想|优质苹果
2 0.21优质E SI1 59.8 61 326 3.89 3.84 2.31理想|优质苹果
3 0.23良好E VS1 56.9 65 327 4.05 4.07 2.31不适用
4 0.290高级I VS2 62.4 58 334 4.2 4.23 2.63理想|高级苹果
5 0.31良好J SI2 63.3 58 335 4.34 4.35 2.75 NA
6 0.24非常好J VVS2 62.8 57 336 3.94 3.96 2.48非常好香蕉
您已经用控制不同正则表达式模式的
进行了分离。

非常感谢——我不知道fuzzyjoin包!