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

如何调整data.table中嵌套列表的结构以生成目标数据集?

解决方案

你可以通过拆分原dt中嵌套的矩阵和向量,将每个组合与其对应的和一一配对,最终合并成目标结构。以下是两种实现方式:

方法1:基于现有dt转换

利用purrr的函数拆分嵌套结构,将每一行的组合矩阵转为列向量列表,再与对应和值配对生成行:

library(data.table)
library(purrr)

# 你的原始数据处理
dt <- data.table(
  amount = c(2,5,9)
)[,
  `:=`(
    amount.set = map(1:.N, function(x) combn(amount, x)),
    sum = map(1:.N, function(x) colSums(combn(amount, x)))
  )
]

# 转换为目标结构
result <- dt[, {
  # 将每个组合矩阵按列拆分为向量列表
  combo_lists <- map(amount.set, ~ asplit(.x, 2))
  # 配对和值与组合,生成完整data.table
  map2_dfr(combo_lists, sum, ~ data.table(sum = .y, amount.set = .x))
}]

# 验证结果
identical(result, desired.output)  # 返回TRUE

方法2:直接生成目标结构

跳过中间分组的dt,一次性生成所有组合并计算和值,更简洁高效:

library(data.table)
library(purrr)

raw_amounts <- c(2,5,9)

# 生成所有长度的组合,合并为单个列表
all_combinations <- map(1:length(raw_amounts), ~ combn(raw_amounts, .x)) %>%
  unlist(recursive = FALSE) %>%
  map(as.vector)

# 计算每个组合的和
all_sums <- map_dbl(all_combinations, sum)

# 生成目标data.table
desired_output <- data.table(sum = all_sums, amount.set = all_combinations)

两种方法都能得到你需要的desired.output结构,第二种方法减少了中间步骤,代码更简洁。

内容的提问来源于stack exchange,提问作者Winfried

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:45:17