`tidyr::unnest`:“无法回收输入”错误 **仅**当使用 `cols = dplyr::everything()`

问题描述 投票:0回答:1

考虑以下因素:

library(magrittr)
sapply(c("dplyr", "tibble", "tidyr"), requireNamespace)

mytbl <- structure(
  list(
    A = list(c("A.1", "A.2")),
    B = list(c("B.1", "B.2")),
    C = list("C.1"),
    D = list(c("D.1", "D.2")),
    E = list(c("E.1", "E.2", "E.3"))),
  class = c("tbl_df", "tbl", "data.frame"),
  row.names = c(NA, -1L))

虽然

tidyr::unnest
适用于每个单独的列,如下所示:

lapply(names(mytbl), function(x) tidyr::unnest(mytbl, cols = x))
尝试使用

unnest

 对所有列进行操作时,
tidyselect
失败:

mytbl %>% tidyr::unnest(cols = dplyr::everything())
Error in `tidyr::unnest()`:
! In row 1, can't recycle input of size 2 to size 3.
Run `rlang::last_trace()` to see where the error occurred.

有什么指点吗?这是怎么回事,我该如何防止这种情况发生?

r tidyverse tidyr tibble
1个回答
0
投票

问题是由于您的列具有不同的长度(例如,A 是 2,但 C 是 1,E 是 3)。返回

data.frame
unnest
对象不能具有不同长度的列。

我不知道有一个简单的解决方案,但一种可能性是将 NA 填充到每个向量以匹配最大长度。这需要先旋转:

library(dplyr)
library(purrr)
library(tidyr)

mytbl %>% 
  pivot_longer(everything()) %>% 
  mutate(value = map(value, `length<-`, max(lengths(value)))) %>% 
  pivot_wider(names_from = name, values_from = value) %>% 
  unnest(everything())

输出

# A tibble: 3 × 5
  A     B     C     D     E    
  <chr> <chr> <chr> <chr> <chr>
1 A.1   B.1   C.1   D.1   E.1  
2 A.2   B.2   NA    D.2   E.2  
3 NA    NA    NA    NA    E.3 
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.