Распечатывать вложенные элементы списка в R - PullRequest
0 голосов
/ 19 октября 2019

У меня есть вложенный список, и я хотел бы распечатать некоторые элементы.

Пример образца ниже:

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 для этого.

Ответы [ 3 ]

1 голос
/ 19 октября 2019

Если вы хотите распечатать все элементы списка, вы можете попробовать это:

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

Обновить

Чтобы получить элемент fifth списка myd1, выможет сделать следующее:

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

Если вам нужно объяснение, дайте мне знать.

1 голос
/ 19 октября 2019
t <- myd1[[1]][[5]]
for (i in t) {
  for (j in i) {
     print(j)
  }  
}
0 голосов
/ 19 октября 2019

Я бы рекомендовал использовать пакет purrr ( шпаргалка ). Он содержит много полезных функций для работы со списками.

Если вы хотите извлечь каждый пятый элемент каждого подсписка, просто используйте

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
...