R语言中基于维度值拆分展开data.table重复记录的实现方法
R data.table多值拆分+全组合实现方法
你可以按如下步骤实现需求,既可以用你提到的expand.grid函数,也可以用data.table原生的交叉连接函数CJ,后者运行效率更高,更适配data.table结构:
完整实现代码
# 加载依赖包 library(data.table) # 构造示例数据集 dt <- data.table( item = c("G,S,GS", "G,S"), timePeriod = c("1995:2000", "2006"), refArea = c("DE,SE", "DE,SE,SK,SI") ) # 定义单行数据处理函数 process_row <- function(item, timePeriod, refArea) { # 拆分逗号分隔的item字段 items <- strsplit(item, ",")[[1]] # 拆分冒号分隔的时间区间,生成连续年份向量 time_parts <- strsplit(timePeriod, ":")[[1]] if (length(time_parts) == 2) { times <- as.character(seq(as.integer(time_parts[1]), as.integer(time_parts[2]))) } else { times <- time_parts } # 拆分逗号分隔的refArea字段 areas <- strsplit(refArea, ",")[[1]] # 生成三个维度的全组合,如需用expand.grid可替换为下面被注释的代码 return(CJ(item = items, timePeriod = times, refArea = areas)) # 如指定用expand.grid,用下面这行代替上面的return语句 # return(as.data.table(expand.grid(item = items, timePeriod = times, refArea = areas, stringsAsFactors = FALSE))) } # 逐行处理原数据,合并所有行的全组合结果 result <- rbindlist(apply(dt, 1, function(x) process_row(x[1], x[2], x[3])))
结果验证
执行完上述代码后,result即为你需要的结构:
- 第一行原数据会生成3个item * 6个年份 * 2个地区 = 36条全组合记录
- 第二行原数据会生成2个item * 1个年份 *4个地区 = 8条全组合记录
- 最终总记录数为44条,前几条和你给出的
test2示例结构完全一致
内容的提问来源于stack exchange,提问作者IRT
相关产品推荐
相关产品推荐

