【问题标题】:Print out nested list items in R打印出R中的嵌套列表项
【发布时间】:2019-10-19 10:47:09
【问题描述】:

我有一个嵌套列表,想打印出某些元素。

下面的示例输入:

list(structure(list(publisherId = 111, categoryId = 42281, levelId = 462, 
    subcategoryIdList = list(42284), exerciseIdList = list(c(495048, 
    495047, 495043, 495044, 495045, 495046, 495049, 495050)), 
    knowledgeBaseEntryIdList = list(list())), class = "data.frame", row.names = 1L), 
    structure(list(publisherId = 111, categoryId = 41394, levelId = 459, 
        subcategoryIdList = list(41395), exerciseIdList = list(
            c(473272, 473270, 473269, 473262, 473261, 465453, 
            465452)), knowledgeBaseEntryIdList = list(list())), class = "data.frame", row.names = 1L))

所以该列表包含另一组列表,然后该列表包含另一组列表。

我可以使用下面提到的代码获取单个嵌套列表的值:

t <- myd1[[1]][[5]]
for (i in t) {
  print(i)
}

但我不知道,如何围绕这个构建另一个 for 循环。

【问题讨论】:

    标签: r list loops lapply


    【解决方案1】:
    t <- myd1[[1]][[5]]
    for (i in t) {
      for (j in i) {
         print(j)
      }  
    }
    

    【讨论】:

    • 这工作正常,但我需要手动更改选定的列表元素,例如:t &lt;- myd1[[3]][[5]] for (i in t) { for (j in i) { print(j) } } 有没有办法替换这一步?
    【解决方案2】:

    如果您的意图是打印列表的所有元素,您可以试试这个:

    for (i in seq_along(1:length(myd1))){
      for(j in seq_along(1: length(myd1[[1]]))){
        print(unlist(myd1[[i]][[j]]))  
      }
    }
    # [1] 111
    # [1] 42281
    # [1] 462
    # [1] 42284
    # [1] 495048 495047 495043 495044 495045 495046 495049 495050
    # NULL
    # [1] 111
    # [1] 41394
    # [1] 459
    # [1] 41395
    # [1] 473272 473270 473269 473262 473261 465453 465452
    # NULL
    
    

    更新

    要获取列表myd1fifth 元素,您可以执行以下操作:

    for (i in seq_along(1:length(myd1))){
      for(j in seq(1)){
        print(unlist(myd1[[i]][[j,(length(myd1[[i]])-1)]]))
      }
    }
    #Output
    #[1] 495048 495047 495043 495044 495045 495046 495049 495050
    #[1] 473272 473270 473269 473262 473261 465453 465452
    

    如果您需要解释,请告诉我。

    【讨论】:

    • 嗨,这对整个组件都非常有效,但是如果只获取此列表的第五个元素,那么您的答案中的数字向量在 c(495048,495047,495043 ...) ?我在执行这种代码时出错test &lt;- for (j in myd1) { for (i in j) { print([[i]][[5]]) } }
    • @user12121022,看我的更新,如果你想获取列表的第五个元素(myd1)
    【解决方案3】:

    我建议使用 purrr 包 (cheat sheet)。它包含许多用于处理列表的有用功能。

    如果要提取每个子列表的每五个元素,只需使用

    map(list_name, 5)
    

    让我们获取您的数据并应用它:

    test_ls <- list(structure(list(publisherId = 111, categoryId = 42281, levelId = 462, 
                        subcategoryIdList = list(42284), exerciseIdList = list(c(495048, 
                                                                                 495047, 495043, 495044, 495045, 495046, 495049, 495050)), 
                        knowledgeBaseEntryIdList = list(list())), class = "data.frame", row.names = 1L), 
         structure(list(publisherId = 111, categoryId = 41394, levelId = 459, 
                        subcategoryIdList = list(41395), exerciseIdList = list(
                          c(473272, 473270, 473269, 473262, 473261, 465453, 
                            465452)), knowledgeBaseEntryIdList = list(list())), class = "data.frame", row.names = 1L))
    
    map(test_ls, 5)
    [[1]]
    [[1]][[1]]
    [1] 495048 495047 495043 495044 495045 495046 495049 495050
    
    
    [[2]]
    [[2]][[1]]
    [1] 473272 473270 473269 473262 473261 465453 465452
    

    如果它是一个命名列表,如您的情况,您也可以按名称进行子集:

    map(test_ls, "exerciseIdList")
    

    如果您想从新的子列表中删除一级层次结构,请使用:

    map(test_ls, 5) %>% flatten
    [[1]]
    [1] 495048 495047 495043 495044 495045 495046 495049 495050
    
    [[2]]
    [1] 473272 473270 473269 473262 473261 465453 465452
    

    【讨论】:

    • 谢谢@TimTeaFan。我不知道 purr 包。这工作得很好。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多