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

Car*_*lin 5 regex if-statement r stringr

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

  [1] A, C, D 
  [2] P, O, E
  [3] W, E, W
  [4] S, B, W
Run Code Online (Sandbox Code Playgroud)

我想测试字符串是否包含某些子字符串,如果是,则返回相应的子字符串,在此示例中,这将是“A”或“B”(请参阅​​下面的所需结果)。每个观察将只包含 2 个子串 (A|B) 中的一个

  [1] A 
  [2] NA
  [3] NA
  [4] B
Run Code Online (Sandbox Code Playgroud)

不,我已经尝试解决这个问题,但它似乎效率很低,而且我也没有让它工作。我怎么能解决呢?

  if (i == "A") {
    type <- "A"
  } else if { (i == "B") 
    type <- "B" 
  } else { type <- "NA"
  } 
Run Code Online (Sandbox Code Playgroud)

注意:我需要遍历 > 1000 次观察

Psi*_*dom 6

假设您有一个字符向量,您可以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"
Run Code Online (Sandbox Code Playgroud)

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

stringr::str_extract(s, '\\b(A|B)\\b')
# [1] "A" NA  NA  "B"
Run Code Online (Sandbox Code Playgroud)

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

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