R записывает элементы вложенного списка в csv - PullRequest
0 голосов
/ 17 января 2020

У меня есть список списков, которые, в свою очередь, содержат несколько списков из-за структуры некоторых файлов JSON. Каждый список имеет одинаковое количество (т.е. 48 списков из 1 списка, из 1 списка, из 1 списка, из 2 списков [где мне нужен первый из последних двух]). Теперь проблема в том, что мне нужно извлечь глубоко вложенные данные из всех этих списков.

Для воспроизводимого примера.

Структура списка примерно такая (возможно, еще один уровень):

list1 = list(speech1 = 1, speech2 = 2)
list2 = list(list1, randomvariable="rando")
list3 = list(list2) #container
list4 = list(list3, name="name", stage="stage")
list5 = list(list4) #container
list6 = list(list5, date="date")
listmain1 = list(list6)
listmain2 = list(list6)
listmain3 = list(listmain1, listmain2)

Структура должна выглядеть примерно так:

[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[[1]][[1]][[1]][[1]]
[[1]][[1]][[1]][[1]][[1]]
[[1]][[1]][[1]][[1]][[1]][[1]]
[[1]][[1]][[1]][[1]][[1]][[1]][[1]]
[[1]][[1]][[1]][[1]][[1]][[1]][[1]]$speech1
[1] 1

[[1]][[1]][[1]][[1]][[1]][[1]][[1]]$speech2
[1] 2


[[1]][[1]][[1]][[1]][[1]][[1]]$randomvariable
[1] "rando"



[[1]][[1]][[1]][[1]]$name
[1] "name"

[[1]][[1]][[1]][[1]]$stage
[1] "stage"



[[1]][[1]]$date
[1] "date"



[[2]]
[[2]][[1]]
[[2]][[1]][[1]]
[[2]][[1]][[1]][[1]]
[[2]][[1]][[1]][[1]][[1]]
[[2]][[1]][[1]][[1]][[1]][[1]]
[[2]][[1]][[1]][[1]][[1]][[1]][[1]]
[[2]][[1]][[1]][[1]][[1]][[1]][[1]]$speech1
[1] 1

[[2]][[1]][[1]][[1]][[1]][[1]][[1]]$speech2
[1] 2


[[2]][[1]][[1]][[1]][[1]][[1]]$randomvariable
[1] "rando"



[[2]][[1]][[1]][[1]]$name
[1] "name"

[[2]][[1]][[1]][[1]]$stage
[1] "stage"



[[2]][[1]]$date
[1] "date"

Конечный результат будет выглядеть как это:

    date  name  speech1  speech2   
1    

2

Я хочу сделать столбцы из переменных, которые мне нужны, и строки из списков, из которых я их извлекаю. В приведенном выше примере мне нужно будет извлечь переменные speech1, speech2, name и date из всех основных списков и преобразовать их в более простой фрейм данных. Я не совсем уверен, что это самый быстрый способ сделать это, и в последние пару дней я опрокидывал голову с помощью lapply () и purrr. В идеале я хочу обрабатывать списки как rowID с плоскими переменными в столбцах, но это тоже было сложно. Любая помощь приветствуется.

1 Ответ

1 голос
/ 17 января 2020

Зацикливая каждый список, выравнивая его и получая значения, можно быстро достичь этого с помощью базовой R:

# Your data
list1 = list(speech1 = 1, speech2 = 2)
list2 = list(list1, randomvariable="rando")
list3 = list(list2) #container
list4 = list(list3, name="name", stage="stage")
list5 = list(list4) #container
list6 = list(list5, date="date")
listmain1 = list(list6)
listmain2 = list(list6)
listmain3 = list(listmain1, listmain2)

# Loop over each list inside listmain3
flatten_list <- lapply(listmain3, function(x) {
  # Flatten the list and extract the values that 
  # you're interested in
  unlist(x)[c("date", "name", "speech1", "speech2")]
})

# bind each separate listo into a data frame
as.data.frame(do.call(rbind, flatten_list))
#>   date name speech1 speech2
#> 1 date name       1       2
#> 2 date name       1       2

Если вы не хотите сопоставить имена строк некоторым значениям, в частности, из каждого списка имена строк должны иметь тот же порядок, что и количество списков. То есть, если вы запустите это для 48 вложенных списков, имена строк будут go вплоть до 1:48, поэтому нет необходимости использовать аргумент row.names.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...