在R中将列表列表展平为数据帧时丢失重复的列名

在R中将列表列表展平为数据帧时丢失重复的列名,r,list,dataframe,data-manipulation,R,List,Dataframe,Data Manipulation,这种类型的“将列表扁平化为数据帧”问题已经被问了好几次,但是我找不到一个解决方案来解决我的特定问题。下面我举了一个小例子。通常,在R中使用httr从API获取数据时,我用来获取数据的大多数数据API都以类似的嵌套列表格式返回数据,如下所示: nested_list = list( list( name = 'joe', match = 13, team = list( list( name = 'teama'

这种类型的“将列表扁平化为数据帧”问题已经被问了好几次,但是我找不到一个解决方案来解决我的特定问题。下面我举了一个小例子。通常,在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_tible
映射后,如果嵌套列表中存在重复的键,则它们将被替换为列名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"  
> 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
取消列表、转置和可存储

> 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"  
> 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
>嵌套的\u列表%>%purrr::map(未列出)%%>%purrr::map(t)%%>%purrr::map(作为可存储)
[[1]]
#一个tibble:1 x 4
名称匹配团队。名称V4
1乔13队A队B队
[[2]]
#一个tibble:1 x 4
名称匹配团队。名称V4
1汤姆15队C队D队
在我的完整数据集中,有大量重复的列名,太多的列名无法编码手动修复来更新这些列名。相反,如果能够更好地处理重复的名称(可能是使用
team.name.1
team.name.2


是否有其他方法可以展平此列表以保留这样的列名?

,因为_tible
具有参数
.name\u 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::映射(未列出)%>%
purrr::map(t)%>%
purrr::map(作为不可编辑的,.name\u repair=“unique”)%>%
dplyr::绑定_行()%>%
readr::type_convert()
#一个tibble:2x4
名称匹配团队。名称…3团队。名称…4
1乔13队A队B队
2汤姆15队C队D队
请注意,我们将此选项传递给
purrr::map()
调用,并将其传递给
as_tible
调用

另一个提示:如果将上一个
purr::map()
替换为
purr:map\u dfr()
,则会自动完成
绑定行()