我有一个列表,每个观察包含多个字符串(见下文)。
[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次观察
答案 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(.))