考虑以下因素:
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.
有什么指点吗?这是怎么回事,我该如何防止这种情况发生?
问题是由于您的列具有不同的长度(例如,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