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

标签 r dplyr tidyverse tidyr purrr

我有一个 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]> 

最佳答案

您可以像这样使用 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

关于r - 使用自定义函数命名由 `nest` (tidyr) 创建的列中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67685029/

相关文章:

r - 疯狂地尝试编写一个对数据框的一列进行操作的简单函数

r - Friedman 在 R 中的检验给出了与 SPSS 不同的结果

r - 使用 R 和 tidyverse 将 tidy 表转换为深度嵌套列表

r - 计算多列的总计百分比

r - 如何在 R 中将列名称的编码更改为 utf 8

python - 使用 rpy2 将 .R 文件采购到 python 中的问题

r - 有没有一种直接的方法可以将日期转换为长格式文本输出?

r - 从全局环境中的对象获取 colname(具有特定模式),然后返回新内容

r - 在 Mutate Dplyr 中使用通配符

r - 操纵日期和连续结果