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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:15:03