【问题标题】:How to store multiple for loops with nested lists?如何使用嵌套列表存储多个 for 循环?
【发布时间】:2021-06-16 20:10:03
【问题描述】:

我正在尝试存储嵌套的 for 循环结果,但我发现这样做很难。这就是我所拥有的:

library("pageviews")

lang = c("it.wikipedia", "de.wikipedia", "fr.wikipedia", "es.wikipedia")
bm = c("ECB","Christine Lagarde")

x = list(list()) # store results

for (i in 1:length(lang)) {
  for (j in 1:length(bm)) {

  x[[i]][[j]] = article_pageviews(project = lang[i], article = bm[j], platform = "all", user_type = "user", start = "2015100100", end = today(), reformat = TRUE, granularity = "daily") 

  }
}

x = do.call(rbind, x) # from list to df

我想做的是为每个langarticle 运行代码并相应地存储它。所以我会有一个列表,it.wikipedia 代表欧洲央行,it.wikipedia 代表拉加德,等等......

谁能帮我做?

谢谢!

【问题讨论】:

    标签: r loops for-loop nested-loops nested-lists


    【解决方案1】:

    如果您坚持通过嵌套的for 循环创建嵌套的list,也许下面的代码示例会有所帮助

    a <- letters[1:5]
    b <- LETTERS[1:5]
    
    x <- c()
    for (i in seq_along(a)) {
      u <- c()
      for (j in seq_along(b)) {
        u <- c(u, list(paste0(a[i], "-", b[j])))
      }
      x <- c(x, list(u))
    }
    

    其中ux 用于收集不同层的列表,这样

    > x
    [[1]]
    [[1]][[1]]
    [1] "a-A"
    
    [[1]][[2]]
    [1] "a-B"
    
    [[1]][[3]]
    [1] "a-C"
    
    [[1]][[4]]
    [1] "a-D"
    
    [[1]][[5]]
    [1] "a-E"
    
    
    [[2]]
    [[2]][[1]]
    [1] "b-A"
    
    [[2]][[2]]
    [1] "b-B"
    
    [[2]][[3]]
    [1] "b-C"
    
    [[2]][[4]]
    [1] "b-D"
    
    [[2]][[5]]
    [1] "b-E"
    
    
    [[3]]
    [[3]][[1]]
    [1] "c-A"
    
    [[3]][[2]]
    [1] "c-B"
    
    [[3]][[3]]
    [1] "c-C"
    
    [[3]][[4]]
    [1] "c-D"
    
    [[3]][[5]]
    [1] "c-E"
    
    
    [[4]]
    [[4]][[1]]
    [1] "d-A"
    
    [[4]][[2]]
    [1] "d-B"
    
    [[4]][[3]]
    [1] "d-C"
    
    [[4]][[4]]
    [1] "d-D"
    
    [[4]][[5]]
    [1] "d-E"
    
    
    [[5]]
    [[5]][[1]]
    [1] "e-A"
    
    [[5]][[2]]
    [1] "e-B"
    
    [[5]][[3]]
    [1] "e-C"
    
    [[5]][[4]]
    [1] "e-D"
    
    [[5]][[5]]
    [1] "e-E"
    

    【讨论】:

      【解决方案2】:

      是的,您需要一个嵌套循环。使用来自purrrmap_df 的一种方法。

      library(purrr)
      map_df(lang, function(x) map_df(bm, function(y) 
             article_pageviews(project = x, article = y, platform = "all", user_type = "user", 
             start = "2015100100", end = today(), reformat = TRUE, granularity = "daily"))) -> result
      

      【讨论】:

      【解决方案3】:

      所以,你的方法是正确的。但是你忘记了一些事情;您要为每种语言存储两篇文章。

      因此你需要 4 个列表,这样,

      x <- list(
          list(),
          list(),
          list(),
          list()
          )
      

      由于您的列表是嵌套的,您需要使用purrr::flatten() 撤消此操作,这样,

      x <- do.call(rbind, purrr::flatten(x)) # from list to df
      

      在你的for-loop之后

      【讨论】:

      • 老实说,我会使用@Ronak 的解决方案,因为在某些时候,列表的数量会变得非常痛苦。
      • 非常感谢你们所有的cmets!我从大家那里学到了很多!
      • 那么今天是美好的一天! :-) 祝你好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 2011-04-07
      相关资源
      最近更新 更多