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

用base R将data.frame按每两行拆分为矩阵 计算对角线乘积生成新列

实现代码(仅使用base R内置函数)

首先构造你提供的示例数据框:

df <- structure(list(a = c(57L, 39L, 31L, 70L, 8L, 93L, 68L, 85L), 
    b = c(161L, 122L, 101L, 104L, 173L, 192L, 110L, 152L)), class = "data.frame", row.names = c(NA, -8L))

方案1:位置索引法(高效简洁,适合固定每两行分组的场景)

利用奇数行是每组第一行、偶数行是每组第二行的规律直接计算:

# 分别提取每组第一行、第二行的a/b值
first_rows_a <- df$a[c(TRUE, FALSE)]
first_rows_b <- df$b[c(TRUE, FALSE)]
second_rows_a <- df$a[c(FALSE, TRUE)]
second_rows_b <- df$b[c(FALSE, TRUE)]

# 按规则填充c列
df$c <- NA
df$c[c(TRUE, FALSE)] <- first_rows_a * second_rows_b
df$c[c(FALSE, TRUE)] <- first_rows_b * second_rows_a

方案2:通用分组法(适合需要灵活调整分组规则的场景)

通过ave函数按分组计算,支持任意行数的偶数长度输入:

# 生成分组ID,每2行归为一组
group_id <- rep(seq_len(nrow(df) / 2), each = 2)
df$c <- ave(seq(nrow(df)), group_id, FUN = function(idx) {
  c(df$a[idx[1]] * df$b[idx[2]], df$b[idx[1]] * df$a[idx[2]])
})

运行后输出df即可得到你要求的结果:

a   b     c
1 57 161  6954
2 39 122  6279
3 31 101  3224
4 70 104  7070
5  8 173  1536
6 93 192 16089
7 68 110 10336
8 85 152  9350

内容的提问来源于stack exchange,提问作者Samet Sökel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:09:01