使用 tidyr::unnest_wider() 时,如何根据 chr 向量命名新列

When using tidyr::unnest_wider(), how to name new columns based on chr vector

我有以下数据结构:

library(tibble)

my_tbl <-
  tibble::tribble(
                   ~col_x,   ~col_y,
                   "a",      list(1, 2, 3),
                   "b",      list(4, 5, 6),
                   "c",      list(7, 8, 9)
                   )

我想使用 tidyr::unnest_wider()col_y 分隔到列中。这些新列的名称应取自 animal_names vector:

animal_names <- c("dog", "cat", "zebra")

如何利用 unnest_wider() 应用来自 animal_names 的名称,从而避免以下命名警告:

library(tidyr)

my_tbl %>%  
  unnest_wider(col_y)
#> New names:
#> * `` -> ...1
#> * `` -> ...2
#> * `` -> ...3
#> New names:
#> * `` -> ...1
#> * `` -> ...2
#> * `` -> ...3
#> New names:
#> * `` -> ...1
#> * `` -> ...2
#> * `` -> ...3
#> # A tibble: 3 x 4
#>   col_x  ...1  ...2  ...3
#>   <chr> <dbl> <dbl> <dbl>
#> 1 a         1     2     3
#> 2 b         4     5     6
#> 3 c         7     8     9

期望输出

## # A tibble: 3 x 4
##   col_x   dog   cat zebra
##   <chr> <dbl> <dbl> <dbl>
## 1 a         1     2     3
## 2 b         4     5     6
## 3 c         7     8     9

请注意 将名称添加到嵌套值 before unnesting.

library(dplyr)
library(purrr)

my_tbl %>%
  mutate(across(col_y, ~map(., .f = ~set_names(.x, animal_names)))) %>%
  unnest_wider(col_y)
#> # A tibble: 3 x 4
#>   col_x   dog   cat zebra
#>   <chr> <dbl> <dbl> <dbl>
#> 1 a         1     2     3
#> 2 b         4     5     6
#> 3 c         7     8     9

但是,当我们处理大型数据集时,这是一个冗余且昂贵的操作。我们不能通过 unnest_wider()names_repair 参数应用名称吗?

names_repair 除了未嵌套的列外,还需要完整的列名。因此,我们创建一个名称向量,不包括与 'animal_names' 向量连接的 'col_y',并将其用于 names_repair

library(dplyr)
library(tidyr)
nm1 <- c(setdiff(names(my_tbl), 'col_y'), animal_names)
my_tbl %>%  
  unnest_wider(col_y, names_repair = ~ nm1) %>%
  suppressMessages

-输出

# A tibble: 3 × 4
  col_x   dog   cat zebra
  <chr> <dbl> <dbl> <dbl>
1 a         1     2     3
2 b         4     5     6
3 c         7     8     9

如果您对消息感到厌烦,可以使用参数 names_sep(在 tidyr 的最新版本中,1.0 或 1.1),这将使消息静音。因为您使用 names_repair 覆盖值,所以可以将任意值设置为 names_sep="".


作者:mstigler 日期:2022-03-04 输出:“reprex::reprex_document” 标题:伍迪-kiwi_reprex.R

library(tidyr)

my_tbl <-
  tibble::tribble(
    ~col_x,   ~col_y,
    "a",      list(1, 2, 3),
    "b",      list(4, 5, 6),
    "c",      list(7, 8, 9))

animal_names <- c("dog", "cat", "zebra")
nm1 <- c(setdiff(names(my_tbl), 'col_y'), animal_names)
my_tbl |>
  unnest_wider(col_y, names_repair = ~ nm1, names_sep = "")
#> # A tibble: 3 × 4
#>   col_x   dog   cat zebra
#>   <chr> <dbl> <dbl> <dbl>
#> 1 a         1     2     3
#> 2 b         4     5     6
#> 3 c         7     8     9

reprex package (v2.0.0)

于 2022-03-04 创建