簡體   English   中英

使用 {tibble} 中的 enframe 后,將 tibble 中的列表列轉換為多列

[英]Transform a list column in a tibble to multiple columns after using enframe from {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), .Dim = 1:2, .Dimnames = list("1", c("X", "Y"))), 
                `1948_1` = structure(c(589800, 97900),  .Dim = 1:2, .Dimnames = list("1", c("X", "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情況下做到這enframe ,一個類似於@Sotos 的解決方案使用purrr::map_df

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, data.frame), 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM