如何检查字符串是否完全由某些字符串模式组成
How to check if a string is made up entirely of certain string patterns
我有一个字符串向量,我需要检查它们是否符合特定条件。例如,如果某个字符串,说 "34|40|65"
完全由这些模式组成:c("34", "35", "37", "48", "65")
,那么我想 return 1,如果他们的字符串不包含任何这些模式,然后我想 return -1。如果字符串包含一些模式,但不是完全由这些模式组成,那么我想 return 0。我已经成功地实现了 1 和 -1,但是在产生 0 的逻辑上遇到了问题。作为代表,对于那些应该产生 0 的字符串,我的逻辑产生 1。这是我的代码,用于确定字符串是否包含这些模式之一。这会给我 1s。
acds <- c("34", "35", "37", "48", "65")
grepl(paste(acds, collapse = "|"), data$comp_cd)
data$comp_cd
是字符串的向量
谢谢!
您可以通过以下方式查看匹配项:
sapply(strsplit(string,"\|"), function(x) x %in% patterns)
您可以轻松地将其包装在一个函数中,以根据要求给出数值结果。
checkstring <-function(string,patterns)
{
matches = sapply(strsplit(string,"\|"), function(x) x %in% patterns)
if(sum(matches)==length(matches))
return(1)
if(sum(matches)==0)
return(-1)
else
return(0)
}
用法示例:
checkstring("34a|65a",patterns=patterns)
[1] -1
checkstring("34|65",patterns=patterns)
[1] 1
checkstring("34|40|65",patterns=patterns)
[1] 0
希望对您有所帮助!
尝试:(抱歉忽略了 -1 部分)
acds <- c("34", "35", "37", "48", "65")
# example-vector:
vec <- c("34|35|37", "34|23|99", "65|37|48", "11|22|33", "34a|35a|37a")
# want
res <- vector("numeric", length(vec))
for (i in 1:length(vec)) {
comp.vec <- unlist(strsplit(vec[i],"[|]"))
nr.matches <- sum(comp.vec %in% acds)
res[i] <- ifelse(nr.matches == length(comp.vec), 1,
ifelse(nr.matches == 0, -1, 0))
}
print(res)
您可以使用 intersect
来获取它,即
f1 <- function(vec, pattern){
v1 <- strsplit(pattern, '|', fixed = TRUE)[[1]]
ind <- intersect(v1, vec)
if(length(ind) == 0){
return(-1)
} else if(length(ind) == length(v1)) {
return(1)
}else return(0)
}
acds <- c("34", "35", "37", "48", "65")
x <- '34|40|65'
f1(acds, x)
#[1] 0
我有一个字符串向量,我需要检查它们是否符合特定条件。例如,如果某个字符串,说 "34|40|65"
完全由这些模式组成:c("34", "35", "37", "48", "65")
,那么我想 return 1,如果他们的字符串不包含任何这些模式,然后我想 return -1。如果字符串包含一些模式,但不是完全由这些模式组成,那么我想 return 0。我已经成功地实现了 1 和 -1,但是在产生 0 的逻辑上遇到了问题。作为代表,对于那些应该产生 0 的字符串,我的逻辑产生 1。这是我的代码,用于确定字符串是否包含这些模式之一。这会给我 1s。
acds <- c("34", "35", "37", "48", "65")
grepl(paste(acds, collapse = "|"), data$comp_cd)
data$comp_cd
是字符串的向量
谢谢!
您可以通过以下方式查看匹配项:
sapply(strsplit(string,"\|"), function(x) x %in% patterns)
您可以轻松地将其包装在一个函数中,以根据要求给出数值结果。
checkstring <-function(string,patterns)
{
matches = sapply(strsplit(string,"\|"), function(x) x %in% patterns)
if(sum(matches)==length(matches))
return(1)
if(sum(matches)==0)
return(-1)
else
return(0)
}
用法示例:
checkstring("34a|65a",patterns=patterns)
[1] -1
checkstring("34|65",patterns=patterns)
[1] 1
checkstring("34|40|65",patterns=patterns)
[1] 0
希望对您有所帮助!
尝试:(抱歉忽略了 -1 部分)
acds <- c("34", "35", "37", "48", "65")
# example-vector:
vec <- c("34|35|37", "34|23|99", "65|37|48", "11|22|33", "34a|35a|37a")
# want
res <- vector("numeric", length(vec))
for (i in 1:length(vec)) {
comp.vec <- unlist(strsplit(vec[i],"[|]"))
nr.matches <- sum(comp.vec %in% acds)
res[i] <- ifelse(nr.matches == length(comp.vec), 1,
ifelse(nr.matches == 0, -1, 0))
}
print(res)
您可以使用 intersect
来获取它,即
f1 <- function(vec, pattern){
v1 <- strsplit(pattern, '|', fixed = TRUE)[[1]]
ind <- intersect(v1, vec)
if(length(ind) == 0){
return(-1)
} else if(length(ind) == length(v1)) {
return(1)
}else return(0)
}
acds <- c("34", "35", "37", "48", "65")
x <- '34|40|65'
f1(acds, x)
#[1] 0