Мне очень нравится новый интерфейс {{x0}}, который пришел с {{x1}}.

Однако, поскольку тидиверс более или менее сосредоточен вокруг tibble, я был немного озадачен тем, что вложенный столбец кажется списком data.frame, даже когда исходные данные были {{X2} } для начала (в этом случае я ожидал, что у меня будет список 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]

Есть ли какие-либо способы добраться до точно такого же результата, что {{x0}} дал / дает мне?

2
Rappster 22 Окт 2019 в 16:36

1 ответ

Лучший ответ

Похоже, что разница - это класс столбца данных при использовании {{x0}} против {{x1}}.

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

Используя оба метода, так и проверки, если они {{x0}} s

 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(test1[[2]])
[1] "vctrs_list_of" "vctrs_vctr"   
 class(test2[[2]])
[1] "list"

Использование {{x0}} в столбце данных будет давать те же результаты, что и {{x1}}}

 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

1
Matt 22 Окт 2019 в 15:41