Вот purrr
(часть tidyverse
) и базовые решения R, при условии, что вы просто хотите заполнить оставшиеся значения в каждом списке NA
. Я принимаю максимальную длину любого списка как len
, тогда для каждого списка делаем rep(NA)
для разницы между длиной этого списка и максимальной длиной любого список.
library(tidyverse)
location <- list("USA","Singapore","UK")
organization <- list("Microsoft","University of London","Boeing","Apple")
person <- list()
date <- list("1989","2001","2018")
Jobs <- list("CEO","Chairman","VP of sales","General Manager","Director")
all_lists <- list(location, organization, person, date, Jobs)
len <- max(lengths(all_lists))
С помощью purrr::map_dfc
вы можете отобразить список списков, при необходимости пометить NA
s, преобразовать в символьный вектор, а затем получить кадр данных всех этих векторов cbind
ed за один конвейерный вызов:
map_dfc(all_lists, function(l) {
c(l, rep(NA, len - length(l))) %>%
as.character()
})
#> # A tibble: 5 x 5
#> V1 V2 V3 V4 V5
#> <chr> <chr> <chr> <chr> <chr>
#> 1 USA Microsoft NA 1989 CEO
#> 2 Singapore University of London NA 2001 Chairman
#> 3 UK Boeing NA 2018 VP of sales
#> 4 NA Apple NA NA General Manager
#> 5 NA NA NA NA Director
В базе R вы можете lapply
использовать одну и ту же функцию в списке списков, затем использовать Reduce
до cbind
полученных списков и преобразовать ее во фрейм данных. Делает два шага вместо одного purrr
:
cols <- lapply(all_lists, function(l) c(l, rep(NA, len - length(l))))
as.data.frame(Reduce(cbind, cols, init = NULL))
#> V1 V2 V3 V4 V5
#> 1 USA Microsoft NA 1989 CEO
#> 2 Singapore University of London NA 2001 Chairman
#> 3 UK Boeing NA 2018 VP of sales
#> 4 NA Apple NA NA General Manager
#> 5 NA NA NA NA Director
Для обоих из них теперь вы можете устанавливать имена по своему усмотрению.