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

