使用tidyr::unnest_wider()时,如何基于字符向量命名新列

5

我有以下数据结构:

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 向量中提取:

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

请注意,在使用unnest之前,@akrun建议为嵌套的值添加名称。
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参数应用名称呢?

2个回答

5
< p > names_repair需要完整的列名,除了列展开之外。因此,我们创建了一个排除了“col_y”的名称向量,并将其与“animal_names”向量连接起来,然后在names_repair中使用它。< /p >
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

谢谢,很简单。但我仍然收到烦人的警告信息。为什么会这样? - Emman
@Emman 你是指 New names: 吗?我认为警告是在 names_repair 之前触发的,因为 list 列没有命名。 - akrun
哦,我真的希望如果我使用unnest_wider()自己的参数,警告就不会显示。你有什么想法可以让警告消失吗? - Emman
1
@Emman 你可以使用 suppressMessages(my_tbl %>% unnest_wider(col_y, names_repair = ~ nm1)) 进行包装。 - akrun
这不是一个警告。它是一条消息,因此可以使用 suppressMessages 来将其静音。 - akrun
显示剩余2条评论

0

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


作者:mstigler 日期:2022-03-04 输出:"reprex::reprex_document" 标题:woody-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年3月4日创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接