在R中将列表列表展平为数据帧时丢失重复的列名 [英] Losing duplicate column names when flattening list-of-lists into dataframes in R

查看:23
本文介绍了在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.1team.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆