从向量中提取字符元素

Extract character elements from vectors

我有一组字符向量:

a <- "bmi + ch | study"
b <- "bmi * ch | study"
c <- "bmi * ch - 1 | study"
d <- "bmi * ch + 0 | study"
e <- "bmi:ch + 0 | study"

在这个例子中,我想提取两个字符串 "bmi""ch",即期望的输出是 c("bmi", "ch")

上面的字符串只是例子;要提取的字符元素可以是 chbmi 以外的任何其他字符。我正在寻找一个通用的解决方案,无需硬编码。

我试过了unlist(stringr::str_extract_all(a, "bmi|ch"))。但是,这里我手动定义模式 "bmi|ch" 以实现所需的输出。因此,这不是一个通用的解决方案。

假设最后注释中定义的向量v。然后我们可以 lapply 使用指示的函数对其进行处理。如果变量的数量始终相同,您可以交替使用 sapply 给出矩阵。

lapply(sub("\|.*", "", v), function(x) all.vars(parse(text = x)))

给予:

[[1]]
[1] "bmi" "ch" 

[[2]]
[1] "bmi" "ch" 

[[3]]
[1] "bmi" "ch" 

[[4]]
[1] "bmi" "ch" 

[[5]]
[1] "bmi" "ch" 

备注

a <- "bmi + ch | study"
b <- "bmi * ch | study"
c <- "bmi * ch - 1 | study"
d <- "bmi * ch + 0 | study"
e <- "bmi:ch + 0 | study"
v <- c(a, b, c, d, e)

这有点复杂而且效率不高。我会把它留在这里,以防有人觉得它有趣。

vecs<-list(a,b, c,d,e)
split_me<-Map(function(x) gsub("([a-z].*[a-z])(\W.*)","\1",x, 

perl=TRUE), vecs)
 lapply(split_me, function(x) 
  unlist(strsplit(gsub("\s", "",x), "[+*:]")))

结果

[[1]]
[1] "bmi" "ch" 

[[2]]
[1] "bmi" "ch" 

[[3]]
[1] "bmi" "ch" 

[[4]]
[1] "bmi" "ch" 

[[5]]
[1] "bmi" "ch" 

数据

a <- "bmi + ch | study"
b <- "bmi * ch | study"
c <- "bmi * ch - 1 | study"
d <- "bmi * ch + 0 | study"
e <- "bmi:ch + 0 | study"
vecs<-list(a,b, c,d,e)