命名列中的项目,该列表由`nest`(tidyr)使用自定义函数创建

name items in column which list created by `nest` (tidyr)using a custom function

我有一个 tibble 我想 nest() 然后 unnest_wider(),同时还以 tibble 格式维护嵌套数据的副本。我知道这听起来不是很优雅,但这是目前针对我的用例的最佳解决方案。但是,当我使用 unnest_wider() 函数时,name_repair 会创建丑陋的 ...1...2 等名称。如何使用某些 purrr 函数 (https://community.rstudio.com/t/how-to-handle-lack-of-names-with-unnest-wider/40496) 命名列表中的项目(它们的长度不同)?这样当我 unnest_wider() 时,列的名称就更好了。

我正在寻找的一个小例子:

library(tidyverse)
mpg %>%
  select(manufacturer, model, cty   ) %>%
  group_by(manufacturer, model) %>%
  nest() %>%
  mutate(vars_in_tibble = data) %>%
  ungroup() %>%
  unnest_wider(data) %>%
  unnest_wider(cty)

给予

# A tibble: 38 x 14
   manufacturer model               ...1  ...2  ...3  ...4  ...5  ...6  ...7  ...8  ...9 ...10 ...11 vars_in_tibble       
   <chr>        <chr>              <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <list>               
 1 audi         a4                    18    21    20    21    16    18    18    NA    NA    NA    NA <tibble[,1] [7 x 1]> 
 2 audi         a4 quattro            18    16    20    19    15    17    17    15    NA    NA    NA <tibble[,1] [8 x 1]> 
 3 audi         a6 quattro            15    17    16    NA    NA    NA    NA    NA    NA    NA    NA <tibble[,1] [3 x 1]> 
 4 chevrolet    c1500 suburban 2wd    14    11    14    13    12    NA    NA    NA    NA    NA    NA <tibble[,1] [5 x 1]> 
 5 chevrolet    corvette              16    15    16    15    15    NA    NA    NA    NA    NA    NA <tibble[,1] [5 x 1]> 
 6 chevrolet    k1500 tahoe 4wd       14    11    11    14    NA    NA    NA    NA    NA    NA    NA <tibble[,1] [4 x 1]> 
 7 chevrolet    malibu                19    22    18    18    17    NA    NA    NA    NA    NA    NA <tibble[,1] [5 x 1]> 
 8 dodge        caravan 2wd           18    17    16    16    17    17    11    15    15    16    16 <tibble[,1] [11 x 1]>
 9 dodge        dakota pickup 4wd     15    14    13    14    14    14     9    11    11    NA    NA <tibble[,1] [9 x 1]> 
10 dodge        durango 4wd           13    13     9    13    11    13    11    NA    NA    NA    NA <tibble[,1] [7 x 1]> 

但我想要

# A tibble: 38 x 14
   manufacturer model              car_1 car_2 car_3 car_4 car_5 car_6 car_7 car_8 car_9 car_10 car_11 vars_in_tibble       
   <chr>        <chr>              <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <list>               
 1 audi         a4                    18    21    20    21    16    18    18    NA    NA    NA    NA <tibble[,1] [7 x 1]> 
 2 audi         a4 quattro            18    16    20    19    15    17    17    15    NA    NA    NA <tibble[,1] [8 x 1]> 
 3 audi         a6 quattro            15    17    16    NA    NA    NA    NA    NA    NA    NA    NA <tibble[,1] [3 x 1]> 
 4 chevrolet    c1500 suburban 2wd    14    11    14    13    12    NA    NA    NA    NA    NA    NA <tibble[,1] [5 x 1]> 
 5 chevrolet    corvette              16    15    16    15    15    NA    NA    NA    NA    NA    NA <tibble[,1] [5 x 1]> 
 6 chevrolet    k1500 tahoe 4wd       14    11    11    14    NA    NA    NA    NA    NA    NA    NA <tibble[,1] [4 x 1]> 
 7 chevrolet    malibu                19    22    18    18    17    NA    NA    NA    NA    NA    NA <tibble[,1] [5 x 1]> 
 8 dodge        caravan 2wd           18    17    16    16    17    17    11    15    15    16    16 <tibble[,1] [11 x 1]>
 9 dodge        dakota pickup 4wd     15    14    13    14    14    14     9    11    11    NA    NA <tibble[,1] [9 x 1]> 
10 dodge        durango 4wd           13    13     9    13    11    13    11    NA    NA    NA    NA <tibble[,1] [7 x 1]> 

我认为您可以将最后一行添加到您的代码中:

library(stringr)

mpg %>%
  select(manufacturer, model, cty   ) %>%
  group_by(manufacturer, model) %>%
  nest() %>%
  mutate(vars_in_tibble = data) %>%
  ungroup() %>%
  unnest_wider(data) %>%
  unnest_wider(cty) %>%
  rename_with(~ str_replace(., "\.\.\.", "car_"), contains("..."))


# A tibble: 38 x 14
   manufacturer model         car_1 car_2 car_3 car_4 car_5 car_6 car_7 car_8 car_9 car_10 car_11
   <chr>        <chr>         <int> <int> <int> <int> <int> <int> <int> <int> <int>  <int>  <int>
 1 audi         a4               18    21    20    21    16    18    18    NA    NA     NA     NA
 2 audi         a4 quattro       18    16    20    19    15    17    17    15    NA     NA     NA
 3 audi         a6 quattro       15    17    16    NA    NA    NA    NA    NA    NA     NA     NA
 4 chevrolet    c1500 suburb~    14    11    14    13    12    NA    NA    NA    NA     NA     NA
 5 chevrolet    corvette         16    15    16    15    15    NA    NA    NA    NA     NA     NA
 6 chevrolet    k1500 tahoe ~    14    11    11    14    NA    NA    NA    NA    NA     NA     NA
 7 chevrolet    malibu           19    22    18    18    17    NA    NA    NA    NA     NA     NA
 8 dodge        caravan 2wd      18    17    16    16    17    17    11    15    15     16     16
 9 dodge        dakota picku~    15    14    13    14    14    14     9    11    11     NA     NA
10 dodge        durango 4wd      13    13     9    13    11    13    11    NA    NA     NA     NA
# ... with 28 more rows, and 1 more variable: vars_in_tibble <list>

相同的输出不同的方法-

library(dplyr)
library(tidyr)

mpg %>%
  select(manufacturer, model, cty) %>%
  group_by(manufacturer, model) %>%
  mutate(col = paste0('cty', row_number())) %>%
  ungroup %>%
  pivot_wider(names_from = col, values_from  = cty) %>%
  rowwise() %>%
  mutate(vars_in_tibble = list(tibble(cty = na.omit(c_across(starts_with('cty')))))) %>%
  ungroup

#   manufacturer model             cty1  cty2  cty3  cty4  cty5  cty6  cty7  cty8  cty9 cty10 cty11 vars_in_tibble  
#   <chr>        <chr>            <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <list>          
# 1 audi         a4                  18    21    20    21    16    18    18    NA    NA    NA    NA <tibble [7 × 1]>
# 2 audi         a4 quattro          18    16    20    19    15    17    17    15    NA    NA    NA <tibble [8 × 1]>
# 3 audi         a6 quattro          15    17    16    NA    NA    NA    NA    NA    NA    NA    NA <tibble [3 × 1]>
# 4 chevrolet    c1500 suburban …    14    11    14    13    12    NA    NA    NA    NA    NA    NA <tibble [5 × 1]>
# 5 chevrolet    corvette            16    15    16    15    15    NA    NA    NA    NA    NA    NA <tibble [5 × 1]>
# 6 chevrolet    k1500 tahoe 4wd     14    11    11    14    NA    NA    NA    NA    NA    NA    NA <tibble [4 × 1]>
# 7 chevrolet    malibu              19    22    18    18    17    NA    NA    NA    NA    NA    NA <tibble [5 × 1]>
# 8 dodge        caravan 2wd         18    17    16    16    17    17    11    15    15    16    16 <tibble [11 × 1…
# 9 dodge        dakota pickup 4…    15    14    13    14    14    14     9    11    11    NA    NA <tibble [9 × 1]>
#10 dodge        durango 4wd         13    13     9    13    11    13    11    NA    NA    NA    NA <tibble [7 × 1]>
# … with 28 more rows

您可以像这样

使用purrr::map将嵌套列表转换为命名列表
mpg %>%
  select(manufacturer, model, cty) %>%
  group_by(manufacturer, model) %>%
  nest() %>%
  mutate(vars_in_tibble = data,
         data = map(data, ~.x %>% mutate(id = paste0('cty_', row_number())) %>%
                      pivot_wider(names_from = id, values_from = cty)
                    )) %>%
  ungroup() %>%
  unnest(data)

# A tibble: 38 x 14
   manufacturer model              cty_1 cty_2 cty_3 cty_4 cty_5 cty_6 cty_7 cty_8 cty_9 cty_10 cty_11 vars_in_tibble      
   <chr>        <chr>              <int> <int> <int> <int> <int> <int> <int> <int> <int>  <int>  <int> <list>              
 1 audi         a4                    18    21    20    21    16    18    18    NA    NA     NA     NA <tibble[,1] [7 x 1]>
 2 audi         a4 quattro            18    16    20    19    15    17    17    15    NA     NA     NA <tibble[,1] [8 x 1]>
 3 audi         a6 quattro            15    17    16    NA    NA    NA    NA    NA    NA     NA     NA <tibble[,1] [3 x 1]>
 4 chevrolet    c1500 suburban 2wd    14    11    14    13    12    NA    NA    NA    NA     NA     NA <tibble[,1] [5 x 1]>
 5 chevrolet    corvette              16    15    16    15    15    NA    NA    NA    NA     NA     NA <tibble[,1] [5 x 1]>
 6 chevrolet    k1500 tahoe 4wd       14    11    11    14    NA    NA    NA    NA    NA     NA     NA <tibble[,1] [4 x 1]>
 7 chevrolet    malibu                19    22    18    18    17    NA    NA    NA    NA     NA     NA <tibble[,1] [5 x 1]>
 8 dodge        caravan 2wd           18    17    16    16    17    17    11    15    15     16     16 <tibble[,1] [11 x 1~
 9 dodge        dakota pickup 4wd     15    14    13    14    14    14     9    11    11     NA     NA <tibble[,1] [9 x 1]>
10 dodge        durango 4wd           13    13     9    13    11    13    11    NA    NA     NA     NA <tibble[,1] [7 x 1]>
# ... with 28 more rows