我有一个列表,它是一个字符串。在此字符串中,字符用“;”分隔。要么 ”,”。因此,我必须使用“ strsplit”。这样,在本示例中,我得到3个列表,其中两个列表中有3个元素,而最后一个列表中只有2个元素。
mylist = c("ac*, be, cd*; daa, efae*, fge*; gefa*, h")
Liste <- strsplit(strsplit(mylist , ";")[[1]], ",")
使用这样的“ strsplit”的原因是当我有一个“;”时在我的字符串中使用“,”作为逻辑“或”,然后它就像逻辑“与”,这意味着我必须在以后的代码中使用每个列表中的一个元素。
所以Liste的输出将是
[[1]]
[1] "ac*" " be" " cd*"
[[2]]
[1] " daa" " efae*" " fge*"
[[3]]
[1] " gefa*" " h"
我试图避免的是使用double for循环,如果可能的话,可能会使代码更快。
所以现在我使用嵌套的for循环来查看mylist中的每个元素。
for (c in 1:length(Liste)){
for (d in 1:length(Liste[[c]])){
# Extracting last character, matching if it is a wildcard
# Liste[[c]][d] Prints all elements from the list
# I need the double for-loop for this check
if (stri_sub(Liste[[c]][d],-1,-1) == '*')
DO SOMETHING
}
}
在这里还能做什么?
答案 0 :(得分:2)
您可以尝试:
library(purrr)
walk(unlist(Liste),
function(x) if (stri_sub(x,-1,-1) == '*')
DO SOMETHING
)
答案 1 :(得分:1)
在这些情况下,它当然取决于您要执行的操作,但是看来stri_sub
是矢量化的,因此您可以利用它。例如,要返回所有符合条件的元素,您可以
lapply(Liste, function(x) {x[stri_sub(x,-1,-1)=='*']})
输出
[[1]]
[1] "ac*" " cd*"
[[2]]
[1] " efae*" " fge*"
[[3]]
[1] " gefa*"
希望这会有所帮助!