在嵌套列中保留原始类型“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 我完全相同的结果吗?
似乎区别在于使用 nest
与 nest_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
同时使用这两种方法并检查它们是否 tibble
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
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
我非常喜欢 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 我完全相同的结果吗?
似乎区别在于使用 nest
与 nest_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
同时使用这两种方法并检查它们是否 tibble
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
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