Apresento aqui um input
data frame que contém listas de data frames que contêm listas. Algumas das listas de nÃvel inferior estão vazias e algumas listas têm comprimento maior que um. Estou procurando algum código R que transformará o input
em output
(também fornecido abaixo)
input = structure(list(pet = c("colin", "fred", "roy"),
fruit = list(structure(list(apple = "red",
banana = "yellow",
mango = "green"),
class = "data.frame",
row.names = 1L),
structure(list(apple = "mouldy",
banana = "bruised",
mango = "cut"),
class = "data.frame",
row.names = 1L),
structure(list(apple = c("windfall", "cooking"),
banana = c("picked", "ripe"),
mango = c("stolen", "round")),
class = "data.frame",
row.names = 1:2)),
flavours = list(structure(list()),
structure(list(sweet = "very",
sour = "ouch",
spicy = "hot"),
class = "data.frame",
row.names = 1L),
structure(list(sweet = c("sugary", "calories"),
sour = c("citrus", "lemon"),
spicy = c("inferno", "burning")),
class = "data.frame",
row.names = 1:2))),
row.names = c(NA, 3L),
class = "data.frame")
output = data.frame(pet = c("colin", "fred", "roy", "roy"),
fruit.apple = c("red", "mouldy", "windfall", "cooking"),
fruit.banana = c("yellow", "bruised", "picked", "ripe"),
fruit.mango = c("green", "cut", "stolen", "round"),
flavours.sweet = c(NA, "very", "sugary", "calories"),
flavours.sour = c(NA, "ouch", "citrus", "lemon"),
flavours.spicy = c(NA, "hot", "inferno", "burning"))
Os recursos devem ser que o output
data frame tenha nomes de colunas que sejam a concatenação dos nomes já existentes no input
, separados por um ponto. Onde o data frame interno tem uma lista vazia, isso deve dar origem a NA no data frame final e não gerar erros. Onde qualquer um dos data frames internos tem uma lista com comprimento maior que um, esse comprimento será correspondido em todas as listas naquela linha (é um design dos dados de entrada) e deve dar origem a duas linhas no output
com os valores correspondentes.
Já tentei uma ampla combinação de abordagens usando coisas como rrapply::rrapply(), data.table::'s .SDcol dentro de lapply, unlist() e todas as funções flatten() que pude encontrar, de purrr:: a jsonlite:: ! Nenhuma funcionou para mim até agora.
Encontrei alguns links do Stack Overflow ( aqui e aqui ) que chegaram perto do que eu queria, mas nenhum entregou os nomes de colunas corretos, lidando com listas vazias e listas maiores que um de uma só vez.
Você pode ajudar, por favor? Obrigado.
Aqui está uma maneira de fazer isso com
tidyr::unnest
Você precisa
replace
list()
com quantidade suficiente deNA
.Você pode encapsular isso em uma função: