在R中将列表列表展平为数据帧时丢失重复的列名
这种类型的“将列表扁平化为数据帧”问题已经被问了好几次,但是我找不到一个解决方案来解决我的特定问题。下面我举了一个小例子。通常,在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'
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()
,则会自动完成绑定行()