在R中将列表列表展平为数据帧时丢失重复的列名 [英] Losing duplicate column names when flattening list-of-lists into dataframes in R
本文介绍了在R中将列表列表展平为数据帧时丢失重复的列名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
httr
从API获取数据时,我用来获取数据的大多数数据API都以类似的嵌套列表格式返回数据,如下所示:
nested_list = list(
list(
name = 'joe',
match = 13,
team = list(
list(
name = 'teama'
),
list(
name = 'teamb'
)
)
),
list(
name = 'tom',
match = 15,
team = list(
list(
name = 'teamc'
),
list(
name = 'teamd'
)
)
)
)
我一直在开发一个很好的函数来展平嵌套的列表列表,因为在R中使用平面数据帧进行分析要容易得多。以下是我目前展平到2D的方法:
nested_list %>%
purrr::map(unlist) %>%
purrr::map(t) %>%
purrr::map(as_tibble) %>%
dplyr::bind_rows() %>%
readr::type_convert() # optional, to format column types
此方法通常运行良好,但在调用as_tibble
映射后,如果嵌套列表中有重复的键,则它们将被替换为列名V1、V2、V3等。我显示了导致此问题的以下步骤:
取消列表
> nested_list %>% purrr::map(unlist)
[[1]]
name match team.name team.name
"joe" "13" "teama" "teamb"
[[2]]
name match team.name team.name
"tom" "15" "teamc" "teamd"
取消列出并转置
> nested_list %>% purrr::map(unlist) %>% purrr::map(t)
[[1]]
name match team.name team.name
[1,] "joe" "13" "teama" "teamb"
[[2]]
name match team.name team.name
[1,] "tom" "15" "teamc" "teamd"
取消列出并转置和AS_Tibble
> nested_list %>% purrr::map(unlist) %>% purrr::map(t) %>% purrr::map(as_tibble)
[[1]]
# A tibble: 1 x 4
name match team.name V4
<chr> <chr> <chr> <chr>
1 joe 13 teama teamb
[[2]]
# A tibble: 1 x 4
name match team.name V4
<chr> <chr> <chr> <chr>
1 tom 15 teamc teamd
在我的完整数据集中,有大量重复的列名,太多了,无法编写手动修复来更新这些列名。相反,最好能更好地处理重复名称(可能使用team.name.1
和team.name.2
)。
是否有其他方法可以展平此列表以保留列名?
推荐答案
as_tibble
有参数.name_repair
。将其设置为"unique"
可满足您的需要:
nested_list %>%
purrr::map(unlist) %>%
purrr::map(t) %>%
purrr::map(as_tibble, .name_repair = "unique") %>%
dplyr::bind_rows() %>%
readr::type_convert()
# A tibble: 2 x 4
name match team.name...3 team.name...4
<chr> <dbl> <chr> <chr>
1 joe 13 teama teamb
2 tom 15 teamc teamd
请注意,我们将此选项传递给purrr::map()
调用,它将传递给as_tibble
调用。
另一个提示:如果将最后一个purrr::map()
替换为purrr:map_dfr()
,bind_rows()
将自动完成。
这篇关于在R中将列表列表展平为数据帧时丢失重复的列名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文