Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何检查字符串是否完全由某些字符串模式组成_R_String_Stringr_Stringi - Fatal编程技术网

R 如何检查字符串是否完全由某些字符串模式组成

R 如何检查字符串是否完全由某些字符串模式组成,r,string,stringr,stringi,R,String,Stringr,Stringi,我有一个字符串向量,我需要检查它们是否符合某个标准。例如,如果某个字符串,比如说“34 | 40 | 65”完全由以下模式组成:c(“34”、“35”、“37”、“48”、“65”),那么我想返回1,如果它们的字符串不包含任何这些模式,那么我想返回-1。如果字符串包含一些模式,但不是完全由这些模式组成,那么我想返回0。我已经成功地实现了1和-1,但是我在逻辑上遇到了问题,这将产生0。目前,我的逻辑为那些应该产生0的字符串产生1。下面是我用来确定字符串是否包含这些模式之一的代码。这会给我1 acd

我有一个字符串向量,我需要检查它们是否符合某个标准。例如,如果某个字符串,比如说
“34 | 40 | 65”
完全由以下模式组成:
c(“34”、“35”、“37”、“48”、“65”)
,那么我想返回1,如果它们的字符串不包含任何这些模式,那么我想返回-1。如果字符串包含一些模式,但不是完全由这些模式组成,那么我想返回0。我已经成功地实现了1和-1,但是我在逻辑上遇到了问题,这将产生0。目前,我的逻辑为那些应该产生0的字符串产生1。下面是我用来确定字符串是否包含这些模式之一的代码。这会给我1

acds <- c("34", "35", "37", "48", "65")
grepl(paste(acds, collapse = "|"), data$comp_cd)

acds您可以通过以下方式检查匹配项:

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)
}
希望这有帮助

试试:(抱歉忽略了-1部分)


acds您可以使用
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

f1这不会返回-1如果找不到匹配项,请尝试vec当尝试将函数应用于字符串向量时,函数出现了一个小问题,但使用lappy编辑sum()条件以说明列表修复了该问题。它给了我想要的结果。非常感谢。太好了,很高兴我们能帮忙!如果你的问题被回答了,请考虑接受其中一个答案。这给了我所寻找的结果。非常感谢。
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)
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