在data.table内部实现矩阵乘法:嵌套列表子表的运算方法
嵌套data.table结构下的跨子表矩阵乘法实现
因为x和z分别存在DT3的a列下两个嵌套的data.table内部,不是DT3的顶层列,只要先穿透列表列的层级拿到对应向量,矩阵乘法的逻辑和你之前独立用单表计算时完全一致,没有特殊语法要求。
具体实现方式
最简直接写法
按照a列的元素存储顺序索引,直接提取对应子表的列运算:# 取a列第1个元素(即DT1)的x向量,和第2个元素(即DT2)的z向量做乘法 result <- DT3[1, a]$x %*% t(DT3[2, a]$z)这里
DT3[1, a]拿到的就是第一行a列存的DT1对象,直接用$就能取到内部的x列;同理DT3[2, a]拿到DT2对象,提取z列即可。可读性更高的分离写法
怕硬写行号容易看错的话,可以先把a列的嵌套子表取到临时变量,再逐层拆列:# 先把a列存的所有子data.table拎出来 nested_tables <- DT3$a # 分别提取要参与运算的向量 x_vec <- nested_tables[[1]]$x z_vec <- nested_tables[[2]]$z # 跑矩阵乘法 result <- x_vec %*% t(z_vec)适配结构变动的泛化写法
如果后续嵌套的子表存储顺序可能调整,不需要硬编码行号的话,可以自动遍历所有子表,按列名匹配提取目标向量再计算:# 遍历a列的所有子表,自动把带x列、z列的内容抽出来 x_vec <- unlist(lapply(DT3$a, \(sub_tbl) sub_tbl$x)) z_vec <- unlist(lapply(DT3$a, \(sub_tbl) sub_tbl$z)) # 执行乘法 result <- x_vec %*% t(z_vec)
常见踩坑提醒
别直接写DT3[, x %*% t(z)]或者DT3[, a$x %*% t(a$z)]——前者的x、z根本不是DT3的顶层列,系统找不到;后者的a本身是装了两个data.table的列表,a$x完全取不到值,肯定报对象不存在的错。必须用列表的[[索引穿透到子表层级,才能拿到对应的列向量参与运算。
内容的提问来源于stack exchange,提问作者tobinz
相关产品推荐
相关产品推荐

