R语言修复按ID生成矩阵维度不匹配问题
问题根源
你生成的矩阵维度与预期相反,核心问题出在g1的分组逻辑:
你用as.integer(gl(length(int1), 3, length(int1)))生成的分组会把int1前3个元素归为第1组、剩余2个归为第2组,刚好把ID B的3个元素分到第一组、ID A的2个元素分到第二组,和你l1列表(A的2×2矩阵在前、B的3×3矩阵在后)的顺序完全颠倒。
调整方案
不需要修改原有的f2函数,仅替换错误的g1分组逻辑即可:
- 直接用你已经设置好的列表名称(ID值)作为分组依据,避免硬编码长度的错误
- 显式指定分组排序为A在前、B在后,和
l1的顺序匹配
修改后完整可运行代码
# 替换原g1定义的部分,其余逻辑不变 g1 <- names(int1) split_int1 <- split(int1, g1)[c("A", "B")] split_int2 <- split(int2, g1)[c("A", "B")] f2 <- function(.int1, .int2) { t(outer(seq_along(.int1), seq_along(.int2), FUN = Vectorize(function(i, j) min(.int1[[i]]$jDate) - min(.int2[[j]]$jDate)))) } lstMat <- map2(split_int1, split_int2, f2) # 执行逐元素除法,维度完全匹配 map2(l1, lstMat, `/`)
说明
- 按ID分组的逻辑更通用,不会因为后续数据集行数变化、分组数量变化出现硬编码错误
- 原
f2函数逻辑正确,会自动根据输入的分组元素数量生成对应维度的矩阵:ID A输入2个元素生成2×2矩阵,ID B输入3个元素生成3×3矩阵
内容的提问来源于stack exchange,提问作者John Huang
相关产品推荐
相关产品推荐

