在 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_row
与 data = 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/