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 次观察
假设您有一个字符向量,您可以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)