假设我有一个字符向量
vals <- c("hello","goodbye","junk")
和正则表达式目标向量
targets <- c("(hello|goodbye)","^j","other")
(我愿意规定vals
中的每个元素都与targets
中的一个元素完全匹配)。是否存在一种现有的,高效/紧凑/矢量化的方法来找到vals
中targets
中每个元素的匹配索引? (match
不起作用:它与字符串表而不是正则表达式匹配。)因此,本示例的期望输出为c(1,1,2)
。欢迎使用Base-R或tidyverse / stringr
解决方案。
答案 0 :(得分:2)
一种方法是将list
的名称和序列分别设置为stack
和两列data.frame。 NULL
元素将被stack
删除。现在,我们提取第二列以获得list
索引
as.integer(stack(setNames(m, seq_along(m)))[,2])
#[1] 1 1 2
注意:此处m
是@ {BenBolker的list
的索引输出,来自grep
的输出
或使用tidyverse
library(tidyverse)
crossing(targets, vals) %>%
mutate(ind = group_indices(., targets)) %>%
filter(str_detect(vals, targets)) %>%
pull(ind)
#[1] 1 1 2
答案 1 :(得分:1)
我想到的最好方法是:反转匹配,即:遍历目标,然后将匹配项填充到与值对应的向量中。
## find positions in `vals` that match each target
m <- lapply(targets,grep,x=vals)
## set up response vector
res <- rep(NA,length(vals))
## fill in matching positions for each target
for (i in seq_along(m)) {
res[m[[i]]] <- i
}
答案 2 :(得分:0)
使用str_detect
中的stringr
,循环遍历每个值以找到目标索引。
library(stringr)
# Data
vals <- c("hello","goodbye","junk")
targets <- c("(hello|goodbye)","^j","other")
# create empty vector to assign matched value later
v <- c()
for (i in 1:length(vals)){
# value to be looked up against target
stg_i <- vals[i]
# min to get first matched target
stg_v <- min(which(str_detect(stg_i, targets)))
# update the value in vector with matched one
v[i] <- stg_v
}
v
[1] 1 1 2