You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:45:18