отключение списка при сохранении индексов

#r #list #dataframe

#r #Список #фрейм данных

Вопрос:

У меня есть список, в котором могут быть либо пустые записи, либо записи, содержащие один элемент, либо записи, содержащие несколько элементов.

 l1 = list(integer(0), 11L, integer(0), integer(0), 11L, 11L, c(6L, 
36L), 16L, 16L, integer(0), integer(0))
  

Я хотел бы отменить перечисление l1 и создать фрейм данных, где для пустых элементов индекс не будет отображаться вообще, а для нескольких элементов индекс будет отображаться несколько раз:

 df = data_frame(entry = c(2, 5, 6, 7, 7, 8, 9), element = c(11, 11, 11, 6, 
36, 16, 16))
  

так, например, здесь запись 7 появляется дважды, потому что в списке есть два элемента (6 и 36).

Как я могу это сделать?

Ответ №1:

Решение «низкого уровня»:

 data.frame(entry=rep(seq_along(l1),lengths(l1)),element=unlist(l1))
#  entry element
#1     2      11
#2     5      11
#3     6      11
#4     7       6
#5     7      36
#6     8      16
#7     9      16
  

Ответ №2:

У нас может быть два варианта. Создайте list именованный, enframe его в tbl_df , а затем unnest list элемент. NULL Элементы будут автоматически удалены

 library(tidyverse)
l1 %>% 
     set_names(seq_along(.)) %>% 
     enframe %>%
     unnest
  

Или после присвоения имени list , stack ему в 2 столбца data.frame

 stack(setNames(l1, seq_along(l1)))[2:1]