tidyr 的旧版本中,我能够使用 tibble::add_row 将行添加到嵌套的 tibble 中。更新到 1.0.0 版后,出现以下错误:


library(dplyr, warn.conflicts = FALSE)
library(tibble)
library(tidyr) # version 1.0.0

mtcars %>%
  tidyr::nest(data = dplyr::select(., -cyl) %>% colnames) %>%
  tibble::add_row(cyl = "all cyl", data = NA)
#> Error: `levels.vctrs_list_of()` not supported.

reprex package (v0.3.0) 于 2020-01-17 创建

这是使用 tidyr 0.8.3 的相同调用
library(dplyr, warn.conflicts = FALSE)
library(tibble)
library(tidyr) # version 0.8.3

 mtcars %>%
   tidyr::nest(-cyl) %>%
   tibble::add_row(cyl = "all cyl", data = NA)
  #> # A tibble: 4 x 2
  #>   cyl     data
  #>   <chr>   <list>
  #> 1 6       <tibble [7 × 10]>
  #> 2 4       <tibble [11 × 10]>
  #> 3 8       <tibble [14 × 10]>
  #> 4 all cyl <lgl [1]>

reprex package (v0.3.0) 于 2020-01-17 创建

其他用户是否遇到相同的情况,或者这是否特定于我的系统环境?
我是否需要更新其他软件包才能运行它?
有解决方法吗?
我应该在 Github 上打开一个问题吗?

更新: 在评论中有人建议更新 vctrs 包。但是更新到最新版本 0.2.1 后仍然出现同样的错误。

背景/上下文

我应该首先详细说明为什么我想将 add_rowdata = NA 一起使用。

我的原始脚本看起来有点像这样:
# tidyr version 0.8.3 add_row was working
iris %>%
  tidyr::nest(-Species) %>%
  tibble::add_row(Species = "All species", data = NA) %>%
  mutate(data = purrr::modify_at(4, ~ as_tibble(select(iris, -Species)))

它返回一个嵌套的 tibble,其中包含所有类别以及一个整体类别。

在 tidyr 1.0.0 下,我的代码如下所示并抛出上述错误:
# tidyr version 1.0.0 where add_row does not work
iris %>%
  tidyr::nest(data = dplyr::select(., -Species) %>% colnames) %>%
  tibble::add_row(Species = "All species", data = NA) %>%
  mutate(data = purrr::modify_at(data, nrow(.), ~ as_tibble(select(iris, -Species))))

由于 add_row 不再在 tidyr 1.0.0 下工作,下一个最好的类似替代方案是@IceCreamToucan 建议的 bind_rows
# tidyr version 1.0.0 alternative with dpylr::bind_rows
iris %>%
  tidyr::nest(data = dplyr::select(., -Species) %>% colnames) %>%
  dplyr::bind_rows(tibble(Species = "All species", data = NA)) %>%
  mutate(data = purrr::modify_at(data, nrow(.), ~ as_tibble(select(iris, -Species))))

然而,由于 tidyr::nest 的语法在 1.0.0 版本下变得更加冗长,我试图简化代码,这似乎是迄今为止最直接的方法,我应该从一开始就选择它:
# What I should have been doing in the first place
iris %>%
  dplyr::bind_rows(mutate(iris, Species = "All species")) %>%
  tidyr::nest(data = dplyr::select(., -Species) %>% colnames)

最佳答案

解决方法是使用 bind_rows 。当您添加到列表列时,看起来 bind_rows 会产生警告,而 add_row 会产生错误。

mtcars %>%
  tidyr::nest(data = dplyr::select(., -cyl) %>% colnames) %>%
  mutate_at(vars(cyl), as.character) %>%
  bind_rows(tibble(cyl = 'all cyl', data = NA))

# # A tibble: 4 x 2
#   cyl     data
#   <chr>   <list>
# 1 6       <tibble [7 x 10]>
# 2 4       <tibble [11 x 10]>
# 3 8       <tibble [14 x 10]>
# 4 all cyl <NULL>
# Warning message:
# In bind_rows_(x, .id) :
#   Vectorizing 'vctrs_list_of' elements may not preserve their attributes

关于r - tibble::add_row 到嵌套 tibble 在 tidyr 1.0.0 下抛出错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59787909/

10-12 19:11