Эффективный способ преобразования именованного / вложенного списка во фрейм данных - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь преобразовать именованный и вложенный список во фрейм данных (к вашему сведению, список является продуктом функции st_nn, где nn обозначает ближайшего соседа, а d обозначает расстояние). Ниже приведен воспроизводимый пример.

nn <- list(c(1,2), c(2,3))
d <- list(c(0, 100), c(11,43))
l <- list(nn, d)

df - это то, что я хочу.

df <- data.frame(nn1 = c(1,2),
                nn2 = c(2,3),
                d1 = c(0, 11),
                d2 = c(100, 43))

Приведенный ниже код выполняет эту работу несколько ad-ho c, но мне любопытно, есть ли более элегантный подход (предпочтительно tidyverse подход).

df2 <- data.frame(rbindlist(l) %>% t()) %>% rename(nn1 = X1, nn2 = X2, d1 = X3, d2 = X4)

1 Ответ

1 голос
/ 05 апреля 2020

Мы можем l oop поверх list, rbind внутренних элементов списка и cbind внешних list

out <-  do.call(cbind.data.frame, lapply(l, function(x) do.call(rbind, x)))
names(out) <- c('nn1', 'nn2', 'd1', 'd2')
out
#  nn1 nn2 d1  d2
#1   1   2  0 100
#2   2   3 11  43

Или с map и unnest_wider

library(dplyr)
library(purrr)
library(tidyr)
map_dfc(l, ~ transpose(.x) %>%
                 map_dfc(~ tibble(col1 = .x) %>%
                           unnest(c(col1)))) %>%
       set_names(c('nn1', 'nn2', 'd1', 'd2'))
# A tibble: 2 x 4
#    nn1   nn2    d1    d2
#* <dbl> <dbl> <dbl> <dbl>
#1     1     2     0   100
#2     2     3    11    43
...