从向量中提取字符元素

Extract character elements from vectors

提问人:Simon Harmel 提问时间:1/2/2022 最后编辑:HenrikSimon Harmel 更新时间:1/2/2022 访问量:375

问:

我有一组字符向量:

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"

R 正则表达式 字符串 字符

评论

0赞 NelsonGon 1/2/2022
您能否添加一些示例数据来使用?你想从中提取这些公式吗?
1赞 Simon Harmel 1/2/2022
@NelsonGon,这是问题中完全可重现的样本数据向量。我还提供了所需的输出。我还提供了我尝试过的东西,并解释了为什么它不是我想要的。(a,b,...e)
1赞 Kat 1/2/2022
你说你想要一个不使用你正在搜索的字符串的解决方案。我不确定如何定义这个答案。在所有可能的解决方案中只有一个 3 字符字符串和一个 2 字符字符串是真的吗?然后正则表达式寻找 3 或 2 个字符的字符串?如果你正在寻找可扩展的东西,你可以使用,但你仍然需要说出你在寻找什么。例如,和 ,其中 是要评估的字符串的列表或向量。pastetofind <- paste(c("bmi","ch"), collapse="|")unlist(str_extract_all(a, tofind))a
1赞 Henrik 1/2/2022
也许这可能是一个开始:从混合模型 (lme4) 公式中提取组件

答:

5赞 G. Grothendieck 1/2/2022 #1

假设末尾注释中定义的向量 v。然后我们可以使用指示的函数应用它。如果变量的数量始终相同,则可以交替使用 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)

评论

0赞 Simon Harmel 1/2/2022
如果有兴趣,这里是一个相关的问题。
2赞 NelsonGon 1/2/2022 #2

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

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)