在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
相关产品推荐
相关产品推荐

