提问人:Simon Harmel 提问时间:1/2/2022 最后编辑:HenrikSimon Harmel 更新时间:1/2/2022 访问量:375
从向量中提取字符元素
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")
上面的字符串只是示例;要提取的字符元素可以是 和 以外的任何其他元素。我正在寻找一个通用的解决方案,没有硬编码。ch
bmi
我试过了.但是,在这里,我手动定义模式以实现所需的输出。因此,这不是一个通用的解决方案。unlist(stringr::str_extract_all(a, "bmi|ch"))
"bmi|ch"
答:
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)
评论
(a,b,...e)
paste
tofind <- paste(c("bmi","ch"), collapse="|")
unlist(str_extract_all(a, tofind))
a