Расплавить вложенный список и сохранить каждый уровень вложенности как отдельный ряд - PullRequest
0 голосов
/ 15 октября 2019

Я хочу data.table::melt() произвольно вложенный список во фрейм данных, сохраняя при этом отдельную строку для каждого уровня вложенности. Например:

my_list <- list(
  "first_node" = list(
    "group_a" = list(
      "E001" = 1:5,
      "E002" = list(
        "F001" = 6:10,
        "F002" = 11:15
      )
    ),
    "group_b" = list(
      "XY01" = list(
        "Z1" = LETTERS[1:5],
        "Z2" = LETTERS[6:10]
      ),
      "YZ" = LETTERS[11:15]
    ),
    "group_c" = list(
      "QQQQ" = list(
        "RRRR" = 200:300
      )
    )
  ),
  "second_node" = list(
    "group_d" = list(
      "L1" = 99:101,
      "L2" = 12
    )
  )
)

Использование my_df <- data.table::melt(my_list) дает нам:

> my_df
    value   L4   L3      L2          L1
1       1 <NA> E001 group_a  first_node
2       2 <NA> E001 group_a  first_node
3       3 <NA> E001 group_a  first_node
4       4 <NA> E001 group_a  first_node
5       5 <NA> E001 group_a  first_node
6       6 F001 E002 group_a  first_node
7       7 F001 E002 group_a  first_node
8       8 F001 E002 group_a  first_node
9       9 F001 E002 group_a  first_node
10     10 F001 E002 group_a  first_node
11     11 F002 E002 group_a  first_node
12     12 F002 E002 group_a  first_node
13     13 F002 E002 group_a  first_node
14     14 F002 E002 group_a  first_node
15     15 F002 E002 group_a  first_node
16      1   Z1 XY01 group_b  first_node
17      2   Z1 XY01 group_b  first_node
[... and so on...]

В то время как я хотел бы сохранить каждый уровень вложенности в качестве дополнительной строки (очевидно, с отсутствующими значениями).

Желаемый результат:

> desired_df
    value   L4   L3      L2          L1
1    <NA> <NA> <NA>     <NA> first_node # individual row for first level
2    <NA> <NA> <NA> group_a  first_node # individual row for second level
3    <NA> <NA> E001 group_a  first_node # individual row for third level
4       2 <NA> E001 group_a  first_node # value-levels remain the same
5       3 <NA> E001 group_a  first_node
6       4 <NA> E001 group_a  first_node
7       5 <NA> E001 group_a  first_node
8    <NA> F001 E002 group_a  first_node # individual row for third level
9       6 F001 E002 group_a  first_node
10      7 F001 E002 group_a  first_node
11      8 F001 E002 group_a  first_node
[... and so on...]

Могу ли я сделать это с помощью data.table::melt(), и если да, то как? Спасибо!

...