【问题标题】:Avoding nested for-loop for nested list避免嵌套列表的嵌套for循环
【发布时间】:2018-08-03 08:29:30
【问题描述】:

我有一个列表,那是一个字符串。在此字符串中,字符由“;”分隔或者 ”,”。所以我必须使用“strsplit”。有了这个,在这个例子中,我最终得到了 3 个列表,其中 2 个列表有 3 个元素,最后一个列表中只有 2 个元素。

mylist = c("ac*, be, cd*; daa, efae*, fge*; gefa*, h")
Liste <- strsplit(strsplit(mylist , ";")[[1]], ",")

像这样使用“strsplit”的原因是当我有一个“;”在我的字符串和“,”作为逻辑 OR,然后它就像一个逻辑 AND,这意味着我必须使用每个列表中的一个元素,稍后在我的代码中。

所以 Liste 的输出将是

[[1]]
[1] "ac*"  " be" " cd*"

[[2]]
[1] " daa" " efae*" " fge*"

[[3]]
[1] " gefa*" " h"

我要避免的是使用双 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
  }
}

这里还能做什么?

【问题讨论】:

    标签: r list for-loop


    【解决方案1】:

    你可以试试:

    library(purrr)
    walk(unlist(Liste),
         function(x) if (stri_sub(x,-1,-1) == '*')
                       DO SOMETHING
         )
    

    【讨论】:

    • 这是有效的,但我将使用@Florian 的代码结束 :)
    【解决方案2】:

    这当然取决于你在这些情况下想要做什么,但似乎stri_sub 是矢量化的,所以你可以利用它。例如,要返回所有符合您条件的元素,您可以这样做

    lapply(Liste, function(x) {x[stri_sub(x,-1,-1)=='*']})
    

    哪个输出

    [[1]]
    [1] "ac*"  " cd*"
    
    [[2]]
    [1] " efae*" " fge*" 
    
    [[3]]
    [1] " gefa*"
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2012-06-25
      • 2017-08-27
      • 2017-11-11
      • 2020-05-21
      • 2019-12-26
      • 2016-05-31
      • 2015-01-24
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多