如何解决使用{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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。