Comment renommer une liste imbriquée qui peut avoir ou non des valeurs en utilisant purrr
? J'ai essayé modify_at()
mais j'obtiens des erreurs si l'une des listes est vide
library(tidyverse)
my_list <-
list(
list(
app = list(id = 123, name = "abc"),
tag = list(id = 456, name = "def")
),
list(
app = list(id = 345, name = "xyz"),
tag = list(id = 678, name = "abc") # <--- fonctionne
# tag = NULL # <--- ne fonctionne pas
)
)
Je veux que app$id
et app$name
deviennent app_id
et app_name
et finalement retourner un data frame
| app_id | app_name | tag_id | tag_name |
|--------|----------|--------|----------|
| 123 | abc | 456 | def |
| 345 | xyz | | |
Cet exemple fonctionne si les deux applications ont des tags, mais si l'un des tags est null
(modifier les commentaires ci-dessus), l'étape modify_at("tag")
échoue
my_list |>
map(
~.x |>
modify_at("app", ~set_names(.x, glue("app_{names(.x)}"))) |>
modify_at("tag", ~set_names(.x, glue("tag_{names(.x)}"))) |>
as.data.frame() |> # aussi pourquoi as_tibble() ne fonctionne pas ici?
rename_all(str_replace_all, "\\.", "_")
) |>
list_rbind()
Plus précisément, ici :
my_list |>
map(
~modify_at(.x, "tag", ~set_names(.x, glue("tag_{names(.x)}")))
)
# Error in `map()`:
# In index: 2.
# Caused by error in `map()`:
# In index: 1.
# With name: tag.
# Caused by error in `set_names()`:
# ! `x` must be a vector
J'ai trouvé ce problème sur GitHub mais j'ai toujours eu des problèmes