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

在R中实现两个DataFrame的数值相乘与汇总计算

R实现DataFrame批量匹配计算方案

1. 模拟示例数据

先构造与需求匹配的测试数据,方便直接验证代码:

# 构造df1(ID + A1-A5数值列)
df1 <- data.frame(
  ID = c(1, 2, 3, 4),
  A1 = c(10, 20, 30, 40),
  A2 = c(5, 15, 25, 35),
  A3 = c(2, 4, 6, 8),
  A4 = c(7, 14, 21, 28),
  A5 = c(3, 6, 9, 12)
)

# 构造df2(ID + C1-C3数值列)
df2 <- data.frame(
  ID = c(1, 2, 3, 4),
  C1 = c(0.5, 0.6, 0.7, 0.8),
  C2 = c(1.2, 1.5, 1.8, 2.1),
  C3 = c(2, 2.5, 3, 3.5)
)

2. 基础版计算逻辑

步骤1:按ID匹配数据

合并两个DataFrame,确保每行ID严格对应:

merged_df <- merge(df1, df2, by = "ID")

步骤2:计算ID总和

提前算出df1中ID列的总和,避免重复计算:

id_total <- sum(df1$ID)

步骤3:批量处理C列计算

定义函数处理单个C列的完整计算流程,再批量应用到所有C列:

# 定义单C列处理函数:A列与C列相乘→求和→除以ID总和
calc_single_c <- function(c_col) {
  a_cols <- merged_df[, paste0("A", 1:5)]
  sapply(a_cols, function(a_col) sum(a_col * c_col)) / id_total
}

# 提取所有C列并批量计算
c_cols <- merged_df[, paste0("C", 1:3)]
result_list <- lapply(c_cols, calc_single_c)

# 转换为df4格式(行=A1-A5,列=C1-C3)
df4 <- as.data.frame(do.call(cbind, result_list))
rownames(df4) <- paste0("A", 1:5)

3. 查看最终结果

运行以下代码输出df4:

print(df4)

可选:用tidyverse实现(更简洁)

若习惯使用tidyverse工具链,可参考以下代码:

library(dplyr)
library(purrr)

id_total <- sum(df1$ID)

df4 <- df2 %>%
  inner_join(df1, by = "ID") %>%
  select(starts_with("C"), starts_with("A")) %>%
  # 遍历每个C列完成计算
  map_dfc(function(c_col) {
    select(., starts_with("A")) %>%
      map_dbl(~ sum(.x * c_col)) / id_total
  }) %>%
  set_names(paste0("C", 1:3)) %>%
  mutate(A = paste0("A", 1:5)) %>%
  relocate(A) %>%
  column_to_rownames("A")

内容的提问来源于stack exchange,提问作者Peter.2055

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:55:18