gpt4 book ai didi

r - 在 case_when 中使用 map2 替换字符串

转载 作者:行者123 更新时间:2023-12-04 10:28:31 25 4
gpt4 key购买 nike

我有一个 2 列小标题,replace_tbl ,其中有一个模式向量和一个替换向量。我想使用这些列中的值在不同的小标题中创建一个新变量,df ,即,对于 df 中的每一行将遍历 replace_tbl$pat 的值并且,如果检测到,将替换为 replace_tbl$replace .如果未检测到模式,则应返回 NA .

我的感觉是我应该使用 mutate() 的某种组合, map2() , 和 case_when() ,但我想不通。基本上我想做下面的代码完成的事情,但不必复制 str_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

最佳答案

你可以使用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
您已经使用 | 进行了分离它控制不同的正则表达式模式。

关于r - 在 case_when 中使用 map2 替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60529652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com