gpt4 book ai didi

regex - 使用具有多个输入的 grepl 分配组

转载 作者:行者123 更新时间:2023-12-02 13:47:51 25 4
gpt4 key购买 nike

我有一个数据框:

df <- data.frame(name=c("john", "david", "callum", "joanna", "allison", "slocum", "lisa"), id=1:7)
df

name id
1 john 1
2 david 2
3 callum 3
4 joanna 4
5 allison 5
6 slocum 6
7 lisa 7

我有一个包含正则表达式的向量,我希望在 df$name 变量中找到它:

vec <- c("lis", "^jo", "um$")

我想要得到的输出如下:

     name id group
1 john 1 2
2 david 2 NA
3 callum 3 3
4 joanna 4 2
5 allison 5 1
6 slocum 6 3
7 lisa 7 1

我可以通过以下方式做到这一点:

df$group <- ifelse(grepl("lis", df$name), 1,
ifelse(grepl("^jo", df$name), 2,
ifelse(grepl("um$", df$name), 3,
NA)

但是,我想直接从“vec”执行此操作。我正在一个 Shiny 的应用程序中 react 性地将不同的值生成到 vec 中。我可以根据 vec 中的索引分配组吗?

此外,如果发生以下情况,该组应该是第一个出现的。例如对于“all”和“um$”,“Callum”为 TRUE,但此处应该得到组 1。

vec <- c("all", "^jo", "um$")

最佳答案

这里有几个选项:

df$group <- apply(Vectorize(grepl, "pattern")(vec, df$name),
1,
function(ii) which(ii)[1])
# name id group
#1 john 1 2
#2 david 2 NA
#3 callum 3 3
#4 joanna 4 2
#5 allison 5 1
#6 slocum 6 3
#7 lisa 7 1
<小时/>

使用命名向量并对其进行合并:

names(vec) <- seq_along(vec)

df <- merge(df, stack(Vectorize(grep, "pattern", SIMPLIFY=FALSE)(vec, df$name)),
by.x="id", by.y="values", all.x = TRUE)

df[!duplicated(df$id),] # to keep only the first match
# id name ind
#1 1 john 2
#2 2 david <NA>
#3 3 callum 3
#4 4 joanna 2
#5 5 allison 1
#6 6 slocum 3
#7 7 lisa 1
<小时/>

for 循环:

df$group <- NA

for ( i in rev(seq_along(vec))) {
TFvec <- grepl(vec[i], df$name)
df$group[TFvec] <- i
}

df
# name id group
#1 john 1 2
#2 david 2 NA
#3 callum 3 3
#4 joanna 4 2
#5 allison 5 1
#6 slocum 6 3
#7 lisa 7 1
<小时/>

或者您可以将 outerstringi 中的 stri_match_first_regex 一起使用

library(stringi)
match.mat <- outer(df$name, vec, stri_match_first_regex)
df$group <- apply(match.mat, 1, function(ii) which(!is.na(ii))[1])
# [1] for first match in `vec`

# name id group
#1 john 1 2
#2 david 2 NA
#3 callum 3 3
#4 joanna 4 2
#5 allison 5 1
#6 slocum 6 3
#7 lisa 7 1

关于regex - 使用具有多个输入的 grepl 分配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34702882/

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