R语言按非正方形块对角线规则计算数据框部分行和的方法
实现方案
下面分别提供base R(含你需要的sapply写法)和dplyr两种实现,均适配大数据框高性能计算需求:
1. base R实现
通用sapply写法(适配任意行/列块长度)
# 示例数据集 df <- data.frame(replicate(expr=rnorm(9),n = 6)) # 配置块大小:每N行一组,每M列一组 row_block_size <- 3 col_block_size <- 2 # 计算行/列分组编号 row_group <- ceiling(seq(nrow(df)) / row_block_size) col_group <- ceiling(seq(ncol(df)) / col_block_size) # 逐行计算对应列块的行和 result <- sapply(seq(nrow(df)), function(i) sum(df[i, col_group == row_group[i]]))
高性能向量化写法(适合超大数据框)
用矩阵掩码+rowSums实现,比逐行遍历快3~10倍:
# 构造求和掩码矩阵 mask <- matrix(0, nrow = nrow(df), ncol = ncol(df)) for (g in unique(row_group)) { mask[row_group == g, col_group == g] <- 1 } # 直接计算行和 result <- rowSums(df * mask)
2. dplyr实现
固定块数写法(你的示例场景直接可用)
library(dplyr) result <- df %>% mutate( row_group = ceiling(row_number() / 3), res = case_when( row_group == 1 ~ X1 + X2, row_group == 2 ~ X3 + X4, row_group == 3 ~ X5 + X6 ) ) %>% pull(res)
通用写法(适配任意块数)
result <- df %>% rowwise() %>% mutate( row_group = ceiling(cur_group_rows() / 3), res = sum(c_across(which(col_group == row_group))) ) %>% pull(res)
关于fatdiag报错的说明
你调用fatdiag报错是因为参数格式错误:size参数需要传入列表类型,分别指定所有行块的大小、所有列块的大小,你的场景需要写为fatdiag(as.matrix(df), size = list(c(3,3,3), c(2,2,2))),但第三方包函数性能不如原生实现,不推荐使用。
内容的提问来源于stack exchange,提问作者curiouskid78
相关产品推荐
相关产品推荐

