代码之家  ›  专栏  ›  技术社区  ›  cgibbs_10

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

  •  1
  • cgibbs_10  · 技术社区  · 7 年前

    我有一个字符串向量,我需要检查它们是否符合某个标准。例如,如果某个字符串 "34|40|65" c("34", "35", "37", "48", "65")

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

    data$comp_cd 是字符串的向量

    3 回复  |  直到 7 年前
        1
  •  1
  •   r.user.05apr    7 年前

    试试:(抱歉忽略了-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)
    
        2
  •  0
  •   Florian    7 年前

    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
    

        3
  •  0
  •   Sotos    7 年前

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