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

在data.table中用matrixStats的colSums2+lapply汇总列报错的技术咨询

解决data.table中使用matrixStats::colSums2分组汇总的错误问题

错误原因解析

你遇到的Argument 'dim.' must be an integer vector of length two错误,核心是函数使用场景不匹配:

  • 执行lapply(as.matrix(.SD), colSums2, na.rm = TRUE)时,as.matrix(.SD)将当前分组的子数据框转为矩阵,但lapply会自动遍历矩阵的每一列,把每一列作为单独的向量传递给colSums2。
  • matrixStats::colSums2是为**二维结构(矩阵/数据框)**设计的,要求输入对象必须具备长度为2的dim属性(行、列维度)。但单个向量的dim属性为NULL,完全不符合函数的输入要求,因此触发错误。

正确的两种实现方式

方式1:直接对分组矩阵调用colSums2(适合批量处理多列)

跳过lapply,直接对分组后的矩阵使用colSums2,最后用as.list将结果转为data.table可识别的列格式:

library(data.table)
library(matrixStats)
set.seed(100)
n = 100
dd = data.table(row_id = 1:n, person=rep(1:20,5), val = runif(n, 10, 50), val2 = runif(n, 20, 40))

# 正确写法
dd[, as.list(colSums2(as.matrix(.SD), na.rm = TRUE)), .SDcols = c("val","val2"), keyby = "person"]

方式2:使用matrixStats的向量求和函数sum2(匹配lapply的遍历逻辑)

如果想保留lapply的写法,应该用matrixStats::sum2——这是专门针对单个向量的求和函数,和base R的sum功能一致但性能更优:

dd[, lapply(.SD, sum2, na.rm = TRUE), .SDcols = c("val","val2"), keyby = "person"]

关键总结

  • matrixStats中带col/row前缀的函数(如colSums2、rowMeans2)是批量处理二维结构的工具,不能直接用于单个向量。
  • 针对单个向量的统计需求,使用不带前缀的对应函数(如sum2、mean2),完全适配data.table分组中lapply遍历列的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:18:28