将一个模式的所有元素与一个向量匹配,并以相同的顺序
Match all elements of a pattern with a vector and in the same order
我创建了一个函数 yes.seq
,它接受两个参数,模式 pat
和数据 dat
。该函数查找数据中是否存在相同序列的模式
例如
dat <- letters[1:10]
dat
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
pat <- c('a',"c","g")
yes.seq(pat = pat,dat = dat)
# [1] TRUE
因为这个序列在模式和中的顺序相同
"a"
“b”"c"
“d”“e”“f”"g"
“h”“i”“j”
例如,如果 'dat' 被反转,那么我们得到 FALSE
:
yes.seq(pat = pat, dat = rev(dat))
# [1] FALSE
这是我的函数
yes.seq <- function(pat , dat){
lv <- rep(F,length(pat))
k <- 1
for(i in 1:length(dat)){
if(dat[i] == pat[k])
{
lv[k] <- TRUE
k <- k+1
}
if(k==length(pat)+1) break
}
return( all(lv) )
}
有没有更高效的解决方案,这个功能对我来说太慢了
我们可以 paste
它们并使用 grepl
grepl(paste(pat, collapse=".*"), paste(dat, collapse=""))
#[1] TRUE
或str_detect
library(stringr)
str_detect(paste(dat, collapse=""), paste(pat, collapse=".*"))
#[1] TRUE
另一个选项:
yes.seq <- function(pat, dat) {
all(pat %in% dat) && all(diff(na.omit(match(pat, dat))) > 0)
}
yes.seq(pat, dat)
# [1] TRUE
yes.seq(c(pat, "ZZ"), dat)
# [1] FALSE
yes.seq(pat, rev(dat))
# [1] FALSE
这是另一个基础 R 选项
yes.seq <- function(pat,dat) identical(order(match(pat, dat)), seq_along(pat))
我创建了一个函数 yes.seq
,它接受两个参数,模式 pat
和数据 dat
。该函数查找数据中是否存在相同序列的模式
例如
dat <- letters[1:10]
dat
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
pat <- c('a',"c","g")
yes.seq(pat = pat,dat = dat)
# [1] TRUE
因为这个序列在模式和中的顺序相同
"a"
“b”"c"
“d”“e”“f”"g"
“h”“i”“j”
例如,如果 'dat' 被反转,那么我们得到 FALSE
:
yes.seq(pat = pat, dat = rev(dat))
# [1] FALSE
这是我的函数
yes.seq <- function(pat , dat){
lv <- rep(F,length(pat))
k <- 1
for(i in 1:length(dat)){
if(dat[i] == pat[k])
{
lv[k] <- TRUE
k <- k+1
}
if(k==length(pat)+1) break
}
return( all(lv) )
}
有没有更高效的解决方案,这个功能对我来说太慢了
我们可以 paste
它们并使用 grepl
grepl(paste(pat, collapse=".*"), paste(dat, collapse=""))
#[1] TRUE
或str_detect
library(stringr)
str_detect(paste(dat, collapse=""), paste(pat, collapse=".*"))
#[1] TRUE
另一个选项:
yes.seq <- function(pat, dat) {
all(pat %in% dat) && all(diff(na.omit(match(pat, dat))) > 0)
}
yes.seq(pat, dat)
# [1] TRUE
yes.seq(c(pat, "ZZ"), dat)
# [1] FALSE
yes.seq(pat, rev(dat))
# [1] FALSE
这是另一个基础 R 选项
yes.seq <- function(pat,dat) identical(order(match(pat, dat)), seq_along(pat))