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

