使用{tibble}

问题描述

我有以下列表

my_list <- list(`3920_0` = structure(c(623700,96400),.Dim = 1:2,.Dimnames = list("1",c("X","Y"))),`3864_0` = structure(c(665100,167400),`1948_1` = structure(c(589800,97900),"Y"))))

如下所示

$`3920_0`
       X     Y
1 623700 96400

$`3864_0`
       X      Y
1 665100 167400

$`1948_1`
       X     Y
1 589800 97900

使用enframe时,我得到以下信息

# A tibble: 3 x 2
  name   value            
  <chr>  <list>           
1 3920_0 <dbl[,2] [1 x 2]>
2 3864_0 <dbl[,2] [1 x 2]>
3 1948_1 <dbl[,2] [1 x 2]>

这几乎是我想要的,但是我想将“值”列中的列表“拆分”为两列“ X”和“ Y”。

或者,如果没有enframe(),会有更好的解决方案来实现最终表吗?

解决方法

您可以在unnest_wider之后使用enframe

my_list %>%
  tibble::enframe() %>%
  tidyr::unnest_wider(value,names_repair = ~c('name','x','y'))

#  name        x      y
#  <chr>   <dbl>  <dbl>
#1 3920_0 623700  96400
#2 3864_0 665100 167400
#3 1948_1 589800  97900

如果您想在没有enframe的情况下执行此操作,则该解决方案类似于使用purrr::map_df的@Sotos

purrr::map_df(my_list,as.data.frame,.id = 'name')
,

在列表中具有数据帧有助于绑定时的输出结构。所以,

dplyr::bind_rows(lapply(my_list,data.frame),.id = 'id')

#          id      X      Y
#1...1 3920_0 623700  96400
#1...2 3864_0 665100 167400
#1...3 1948_1 589800  97900
,

使用rbindlist的另一个选项:

library(data.table)
rbindlist(lapply(my_list,idcol = 'name')

     name      X      Y
1: 3920_0 623700  96400
2: 3864_0 665100 167400
3: 1948_1 589800  97900
,

我们还可以转换为tibble并将其绑定在一起

library(purrr)
library(tibble)
map_dfr(my_list,as_tibble,.id = 'name')
# A tibble: 3 x 3
#  name        X      Y
#  <chr>   <dbl>  <dbl>
#1 3920_0 623700  96400
#2 3864_0 665100 167400
#3 1948_1 589800  97900