R 在case_中使用map2替换字符串
我有一个2列tible,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(
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包!