我有以下数据结构:
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?
names_repair除了未嵌套的列之外,还需要完整的列名称。因此,我们创建一个名称向量,不包括与“animal_names”向量连接的“col_y”,并将其用于names_repair
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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n