如何调整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
相关产品推荐
相关产品推荐

