gpt4 book ai didi

r - 使用(如果可能)函数方法修改基于正则表达式 (regex) 向量的向量

转载 作者:行者123 更新时间:2023-12-04 14:57:42 26 4
gpt4 key购买 nike

我有一个包含一些列的数据框,我想修改这些列,具体取决于它们是否匹配包含在带有正则表达式的向量中的某些模式

library(fuzzyjoin)
library(tidyverse)

(df <- tribble(~a,
"GUA-ABC",
"REF-CDE",
"ACC.S93",
"ACC.ATN"))

#> # A tibble: 4 x 1
#> a
#> <chr>
#> 1 GUA-ABC
#> 2 REF-CDE
#> 3 ACC.S93
#> 4 ACC.ATN

根据我想粘贴文本的模式,例如,对于包含 GUA 的模式,在由点连接的链的末端粘贴“GUA001”,对于包含 REF 的模式,在链的末端粘贴“GUA002”同理,可以得到:

# This is the resulting data.frame I need

#> # A tibble: 4 x 1
#> a
#> <chr>
#> 1 GUA-ABC.GUA001
#> 2 REF-CDE.GUA002
#> 3 ACC.S93
#> 4 ACC.ATN

我想到了一些办法。

方法#1

 # list of patterns to search
patterns <- c("\\b^GUA\\b", "\\b^REF\\b")

# Create a named list for recoding
model_key <- list("\\b^GUA\\b" = "GUA001",
"\\b^REF\\b" = "GUA002")

# Create a data.frame of regexs
(k <- tibble(regex = patterns))

#> # A tibble: 2 x 1
#> regex
#> <chr>
#> 1 "\\b^GUA\\b"
#> 2 "\\b^REF\\b"

# perform a regex_left_join to identify the pattern
df %>%
regex_left_join(k, by = c(a = "regex")) %>%
mutate(

across(regex, recode, !!!model_key),
a = case_when(

!is.na(regex) ~ str_c(a, regex, sep = "."),
TRUE ~ a)

) %>% select(-regex)

#> # A tibble: 4 x 1
#> a
#> <chr>
#> 1 GUA-ABC.GUA001
#> 2 REF-CDE.GUA002
#> 3 ACC.S93
#> 4 ACC.ATN

为什么这种方法不是最优的?原始数据框有数百万行,fuzzyjoin::regex_left_join 执行此操作花费的时间太长。

方法#2

 patron <- c("GUA001" = "\\b^GUA\\b", "GUA002" = "\\b^REF\\b")
newtex <- c("GUA001", "GUA002")

pegar <- function(string, pattern, text_to_paste) {

if_else(condition = str_detect(string, pattern),
true = str_c(string, text_to_paste, sep = "."),
false = string)

}

map2_dfr(.x = patron, .y = newtex, ~ pegar(string = df$a,
pattern = .x,
text_to_paste = .y))
#> # A tibble: 4 x 2
#> GUA001 GUA002
#> <chr> <chr>
#> 1 GUA-ABC.GUA001 GUA-ABC
#> 2 REF-CDE REF-CDE.GUA002
#> 3 ACC.S93 ACC.S93
#> 4 ACC.ATN ACC.ATN

reprex package 创建于 2021-05-20 (v2.0.0)

使用方法 # 2 我无法获得单个列。

作为旁注,使用 str_replace_all 并使用命名向量替换字符串中的某些值目前似乎不是一个好的选择。

有没有办法更优化地做到这一点?

最佳答案

利用 stringrpurrr 的一个选项可能是:

imap_dfr(model_key,
~ df %>%
filter(str_detect(a, .y)) %>%
mutate(a = str_c(a, .x, sep = "."))) %>%
bind_rows(df %>%
filter(str_detect(a, str_c(names(model_key), collapse = "|"), negate = TRUE)))

a
<chr>
1 GUA-ABC.GUA001
2 REF-CDE.GUA002
3 ACC.S93
4 ACC.ATN

关于r - 使用(如果可能)函数方法修改基于正则表达式 (regex) 向量的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67628146/

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