使用tidyr::unnest()展开含列表列的DataFrame时遇尺寸循环错误求助
解决tidyr::unnest()展开列表列时的循环回收错误
问题重现
尝试展开包含列表列的DataFrame时出现以下错误:
Error in
unnest():
! In row 2, can't recycle input of size 2 to size 4.
使用的代码及数据结构如下:
library(dplyr) library(tidyr) df = structure(list(num_dos = c(41713200L, 41735799L, 41740459L, 41819734L ), `DAT_SD_29 ` = list("08/07/2024 15:41", c("11/07/2024 13:16", "09/08/2024 14:17"), "16/07/2024 13:21", "01/08/2024 17:06"), `DAT_SD_99 ` = list(c("09/07/2024 05:09", "09/07/2024 22:58" ), c("29/07/2024 16:35", "12/07/2024 05:09", "12/07/2024 22:56", "23/08/2024 08:22"), c("05/08/2024 15:34", "10/07/2024 10:40", "20/07/2024 12:22", "10/08/2024 10:18"), "26/07/2024 11:50")), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame")) df %>% tidyr::unnest()
错误原因
新版tidyr的unnest()默认要求同一行内所有列表列的长度必须一致。第2行数据中,DAT_SD_29 列表长度为2,DAT_SD_99 列表长度为4,两者不匹配,触发循环回收错误。
解决方案
方案1:生成所有元素组合(笛卡尔积)
若需要将两个列表列的所有元素配对展开,使用cross = TRUE参数:
df %>% tidyr::unnest(c(`DAT_SD_29 `, `DAT_SD_99 `), cross = TRUE)
方案2:循环补齐较短列表
若希望将较短列表重复至较长列表的长度,实现一一对应展开,可先手动处理列表长度再展开:
library(purrr) df %>% mutate( # 计算每行两个列表的最大长度 max_len = pmap_dbl(list(`DAT_SD_29 `, `DAT_SD_99 `), ~ max(length(..1), length(..2))), # 循环补齐两个列表至最大长度 `DAT_SD_29 ` = map2(`DAT_SD_29 `, max_len, ~ rep(.x, length.out = .y)), `DAT_SD_99 ` = map2(`DAT_SD_99 `, max_len, ~ rep(.x, length.out = .y)) ) %>% select(-max_len) %>% tidyr::unnest(c(`DAT_SD_29 `, `DAT_SD_99 `))
额外建议
列名末尾的空格可能引发不必要的麻烦,建议先重命名去除空格:
df <- df %>% rename( DAT_SD_29 = `DAT_SD_29 `, DAT_SD_99 = `DAT_SD_99 ` )
内容的提问来源于stack exchange,提问作者Mostafa90
相关产品推荐
相关产品推荐

