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

Emm*_*man 5 r unnest tidyr

我有以下数据结构:

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)
                   )
Run Code Online (Sandbox Code Playgroud)

我想用它来tidyr::unnest_wider()分隔col_y列。这些新列的名称应取自animal_names向量:

animal_names <- c("dog", "cat", "zebra")
Run Code Online (Sandbox Code Playgroud)

我如何利用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
Run Code Online (Sandbox Code Playgroud)

期望的输出

## # 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
Run Code Online (Sandbox Code Playgroud)

请注意,@akrun 建议在 ing之前 向嵌套值添加名称unnest

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
Run Code Online (Sandbox Code Playgroud)

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

akr*_*run 5

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

\n
library(dplyr)\nlibrary(tidyr)\nnm1 <- c(setdiff(names(my_tbl), 'col_y'), animal_names)\nmy_tbl %>%  \n  unnest_wider(col_y, names_repair = ~ nm1) %>%\n  suppressMessages\n
Run Code Online (Sandbox Code Playgroud)\n

-输出

\n
# A tibble: 3 \xc3\x97 4\n  col_x   dog   cat zebra\n  <chr> <dbl> <dbl> <dbl>\n1 a         1     2     3\n2 b         4     5     6\n3 c         7     8     9\n
Run Code Online (Sandbox Code Playgroud)\n