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

