if else语句检查字符串是否包含R中的子字符串

时间:2018-06-12 14:12:25

标签: r regex if-statement stringr

我有一个列表,每个观察包含多个字符串(见下文)。

  [1] A, C, D 
  [2] P, O, E
  [3] W, E, W
  [4] S, B, W

我想测试字符串是否包含某些子字符串,如果是,则返回相应的子字符串,在本例中,这将是“A”或“B”(参见下面的期望结果)。每次观察只包含2个子串中的任何一个(A | B)

  [1] A 
  [2] NA
  [3] NA
  [4] B

不,我没有尝试解决这个问题,但这似乎非常低效,而且我也没有让它发挥作用。我该怎么解决?

  if (i == "A") {
    type <- "A"
  } else if { (i == "B") 
    type <- "B" 
  } else { type <- "NA"
  } 

注意:我需要将其循环通过&gt; 1000次观察

5 个答案:

答案 0 :(得分:3)

假设您有一个字符向量,您可以使用stringr::str_extract来实现此目的:

s <- c('A, C, D', 'P, O, E', 'W, E, W', 'S, B, W')
s
# [1] "A, C, D" "P, O, E" "W, E, W" "S, B, W"
stringr::str_extract(s, 'A|B')
# [1] "A" NA  NA  "B"

如果首选匹配字词,请使用字词边界\\b

stringr::str_extract(s, '\\b(A|B)\\b')
# [1] "A" NA  NA  "B"

如果子字符串由", "定义,则可以使用此正则表达式(?<=^|, )(A|B)(?=,|$)

# use the test case from G.Grothendieck
stringr::str_extract(c("A.A, C", "D, B"), '(?<=^|, )(A|B)(?=,|$)')
# [1] NA  "B"

答案 1 :(得分:1)

不使用包而只使用向量:

vec <- c('A, C, D', 
         'P, O, E', 
         'W, E, W', 
         'S, B, W')

ifelse(grepl('A', vec), 'A', ifelse(grepl('B', vec), 'B', NA))

您可以进一步简化此操作,但我将其保留为展开形式,以便您了解其工作原理。

答案 2 :(得分:1)

下面我们提供strapply和base解决方案。 strapply解决方案非常短,但如果要匹配的元素可以是目标的子串,它将无法工作;但是,它们不是问题中的子串,所以它应该在那里工作。即使在这种情况下,基本解决方案也可以工作,因为它使用精确匹配而不是正则表达式。

1)strapply(gsubfn)在gsubfn中使用strapply。如果要将列表作为输出,请忽略simplify=TRUE。如果需要,[AB]可以替换为A|B

library(gsubfn)

strapply(x, "[AB]", empty = NA, simplify = TRUE)
## [1] "A" NA  NA  "B"

2)base 拆分输入并为拆分的每个元素筛选出匹配列表L。可能L足以满足您的需求,但如果没有,则最后一行将其简化为向量,并用NA替换零长度元素。

L <- lapply(strsplit(x, ", "), Filter, f = function(x) x %in% c("A", "B"))
unlist(replace(L, !lengths(L), NA))
## [1] "A" NA  NA  "B"

注意

x <- c("A, C, D", "P, O, E", "W, E, W", "S, B, W")

答案 3 :(得分:0)

在Base R中,您可以遍历字符串以检测并将其分配给@CucumberOptions( features = "src/test/resources/features", plugin = {"pretty", "html:target/site/cucumber-pretty", "json:target/cucumber.json"} ) [<-)的输出。

[<-

答案 4 :(得分:0)

如果您希望以列表结尾,可以使用:

library(magrittr)
x = list(
     c("A", "C", "D"), 
     c("P", "O", "E"),
     c("W", "E", "W"),
     c("S", "B", "W")
     )

myFunction <- function(x){

     x1 <- paste0(x, collapse = "")

     ifelse(stringr::str_detect(x1 , "A|B"), stringr::str_extract(x1, "A|B"), NA)
}

x %>% purrr::map(~ myFunction(.))