在嵌套列中保留原始类型“tibble”

Preserve original type `tibble` in nested columns

我非常喜欢 v1.0.0 附带的新 tidyr 界面。

然而,随着 tidyverse 或多或少地以 tibble 为中心,我有点困惑嵌套列似乎是 data.frame 的列表 - 即使原始数据是一个 tibble 开始(在这种情况下,我希望我最终在嵌套列中得到一个 tibble 的列表):

library(magrittr)

df <- tibble::tribble(
  ~id, ~x, ~y,
  1, 10, 20,
  1, 100, 200,
  2, 1, 2
)
df
#> # A tibble: 3 x 3
#>      id     x     y
#>   <dbl> <dbl> <dbl>
#> 1     1    10    20
#> 2     1   100   200
#> 3     2     1     2

df %>% tidyr::nest_legacy(-id)
#> # A tibble: 2 x 2
#>      id data            
#>   <dbl> <list>          
#> 1     1 <tibble [2 x 2]>
#> 2     2 <tibble [1 x 2]>

df %>% tidyr::nest(data = -id)
#> # A tibble: 2 x 2
#>      id           data
#>   <dbl> <list<df[,2]>>
#> 1     1        [2 x 2]
#> 2     2        [1 x 2]

有什么方法可以得到与 tidyr::nest_legacy() gave/gives 我完全相同的结果吗?

似乎区别在于使用 nestnest_legacy 时数据列的 class。

library(tidyr)
library(dplyr)

df <- tibble::tribble(
   ~id, ~x, ~y,
   1, 10, 20,
   1, 100, 200,
   2, 1, 2
 )
 df
# A tibble: 3 x 3
#     id     x     y
#  <dbl> <dbl> <dbl>
#1     1    10    20
#2     1   100   200
#3     2     1     2

同时使用这两种方法并检查它们是否 tibbles

 test1 <- df %>% nest(data = -id)
 test2 <- df %>% nest_legacy(-id)

 test1 %>% '[['(2) %>% '[['(1) %>% is_tibble()
[1] TRUE

 test1
# A tibble: 2 x 2
#     id           data
#  <dbl> <list<df[,2]>>
#1     1        [2 x 2]
#2     2        [1 x 2]

 test2 %>% '[['(2) %>% '[['(1) %>% is_tibble()
[1] TRUE

 test2
# A tibble: 2 x 2
#     id data            
#  <dbl> <list>          
#1     1 <tibble [2 x 2]>
#2     2 <tibble [1 x 2]>

检查数据列class

 class(test1[[2]])
[1] "vctrs_list_of" "vctrs_vctr"   
 class(test2[[2]])
[1] "list"

在您的数据列上使用 as.list 将产生与 nest_legacy

相同的结果
 test3 <- df %>% nest(data = -id) %>% mutate_at(vars(data), ~as.list(.))
 test3

# A tibble: 2 x 2
#     id data            
#  <dbl> <list>          
#1     1 <tibble [2 x 2]>
#2     2 <tibble [1 x 2]>


 identical(test2, test3)
[1] TRUE