У меня есть список, который я превращаю в фрейм данных. Список возвращается из API и содержит несколько значений NULL
. Есть вопросы по SO по этой теме здесь и здесь, но они либо имеют дело с кадрами данных или, в случае второй ссылки, OP было предложено сначала преобразовать в кадр данных. Я хочу сохранить структуру списка.
Я разбираю его следующим образом, вот некоторые примеры данных:
example <- list(
list(
ID = "1",
Name = "Joe",
Middle_name = "Alan",
Surname = "Smith"
),
list(
ID = "2",
Name = "Sarah",
Middle_name = NULL,
Surname = "Jones"
),
list(
ID = "3",
Name = "Robert",
Middle_name = "Myles",
Surname = "McDonnell"
)
)
N <- NA_character_
df <- tibble::tibble(
id = purrr::map_chr(example, .null = N, "ID"),
name = purrr::map_chr(example, .null = N, "Name"),
middle = purrr::map_chr(example, .null = N, "Middle_name"),
surname = purrr::map_chr(example, .null = N, "Surname")
)
> df
# A tibble: 3 x 4
id name middle surname
<chr> <chr> <chr> <chr>
1 1 Joe <NA> Smith
2 2 Sarah <NA> Jones
3 3 Robert <NA> McDonnell
Похоже, у этой проблемы есть некоторая история в репозитории, но когда я использую функции purrr например is_empty()
или compact()
, я либо получаю сообщение об ошибке, либо оно не работает.
Кто-нибудь знает, как я могу этого добиться, предпочтительно придерживаясь метода tibble
и map_chr
, который я использую выше?
map_df(transpose(example), ~map_chr(.,~ifelse(is.null(.),NA,.)))
? - person HubertL   schedule 24.06.2017example
вы используете Middle_name, но вmap_chr
вы ссылаетесь на Middle_Name. - person aosmith   schedule 24.06.2017map_chr
означает перебор всего списка N раз. Делая это поэлементно, как с lapply, иrbind
выполняет итерацию по списку один раз. Быстрый тест производительности показал, что подходmap_chr
работает в десять раз медленнее. Это цена, которую вы платите за чистоту. - person Spacedman   schedule 24.06.2017map_chr()
N раз эквивалентно использованиюvapply()
N раз. Ничего особенного в этом нет. Только что протестированный сbind_rows()
иflatten_chr()
аккуратная версия на самом деле быстрее, чем предлагаемая базовая версия. Более того, мы подумывали о том, чтобы использовать для такого рода проблем подход, основанный на спецификации столбца. Это позволило быreadr
API создавать фреймы данных из списков и могло бы быть удобно для разнородных списков списков. - person Lionel Henry   schedule 13.11.2017