为嵌套列表避免嵌套的for循环

时间:2018-08-03 08:29:30

标签: r list for-loop

我有一个列表,它是一个字符串。在此字符串中,字符用“;”分隔。要么 ”,”。因此,我必须使用“ 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
  }
}

在这里还能做什么?

2 个答案:

答案 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*"

希望这会有所帮助!