R Заполнение пропущенных значений с помощью NA для фрейма данных - PullRequest
0 голосов
/ 26 июня 2018

Я сейчас пытаюсь создать фрейм данных со следующими списками

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")

Когда я пытаюсь создать фрейм данных, я получаю (очевидную) ошибку, что длины списков не равны. Я хочу найти способ сделать списки одинаковой длины или заполнить пропущенные записи в фрейме "NA". После некоторых поисков я не смог найти решение

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы можете сделать:

data.frame(sapply(dyem_list, "length<-", max(lengths(dyem_list))))

   location         organization person date            Jobs
1       USA            Microsoft   NULL 1989             CEO
2 Singapore University of London   NULL 2001        Chairman
3        UK               Boeing   NULL 2018     VP of sales
4      NULL                Apple   NULL NULL General Manager
5      NULL                 NULL   NULL NULL        Director

Где dyem_list является следующим:

dyem_list <- list(
  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")
)
0 голосов
/ 26 июня 2018

Вот 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

Для обоих из них теперь вы можете устанавливать имена по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...