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

R语言data.table如何实现排除当前行后其余行按列求和生成矩阵

R 按行生成对应求和矩阵实现方案

核心逻辑:提前计算high、low两列的全局总和,排除当前行后的列和直接用「全局总和 - 当前行对应列值」计算,无需每次循环重复做子集求和,运行效率更高。


方法1:基础R实现(无额外依赖)

# 构建测试数据集
test = data.frame(
  genotypes =  c('A|A', 'A|G', 'G|G'), 
  high = c(73, 113, 87), 
  low = c(77, 155, 63)
)

# 指定要计算的数值列,提前计算列总和
num_cols <- c("high", "low")
col_sums_total <- colSums(test[, num_cols])

# 遍历每一行生成目标矩阵,结果存储在列表中
result <- lapply(seq_len(nrow(test)), function(row_idx) {
  current_row <- as.numeric(test[row_idx, num_cols])
  rest_sum <- col_sums_total - current_row
  matrix(c(current_row, rest_sum), nrow = 2, byrow = TRUE)
})

运行后输出第一个矩阵验证结果,和示例完全匹配:

> result[[1]]
     [,1] [,2]
[1,]   73   77
[2,]  200  218

方法2:data.table 高效实现(适合大数据量场景)

library(data.table)
# 转换为data.table对象
setDT(test)

# 提前计算两列全局总和
sum_high <- sum(test$high)
sum_low <- sum(test$low)

# 按行直接生成对应矩阵,输出为列表
result <- test[, .(
  mat = list(matrix(c(high, sum_high - high, low, sum_low - low), nrow = 2))
), by = seq_len(nrow(test))]$mat

注意事项

  • 两种方法输出结果完全一致,result是长度等于数据集行数的列表,每个元素对应你需要的2行矩阵
  • 不推荐每次循环排除当前行后再重新计算列和的写法,该写法时间复杂度为O(n²),数据量较大时运行速度会明显变慢,提前算全局总和再做差的写法时间复杂度为O(n),性能优势明显

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:30:57