如何在R中按CIF汇总多数据集X、Y变量并更新原数据集
解决R中多数据集按CIF关联计算求和列的问题
方案概述
使用dplyr(tidyverse核心包)的关联与列计算功能,按CIF字段将目标数据集与后续数据集匹配,完成指定求和逻辑,缺失匹配项自动填充NA(对应示例中的.)。以下是针对你需求的分步实现:
1. 准备环境与原始数据
首先加载dplyr,并修正你提供的示例数据中finance3的长度不匹配问题:
library(dplyr) # 原始数据集 finance1 <- data.frame(CIF = c('A1', 'A2', 'A3'), X= c(500000, 1500000, 2000000), Y= c(250000, 500000, 1500000)) finance2 <- data.frame(CIF = c('A1', 'A2', 'A3', 'A5'), X= c(500000, 1500000, 2000000, 2500000), Y= c(250000, 500000, 1500000, 2000000)) # 修正原数据CIF与X/Y长度不匹配问题 finance3 <- data.frame(CIF = c('A1', 'A2', 'A3', 'A9', 'A10'), X= c(500000, 1500000, 2000000, 2500000, 3000000), Y= c(250000, 500000, 1500000, 2000000, 2500000)) finance4 <- data.frame(CIF = c('A1', 'A6'), X= c(500000, 3000000), Y= c(250000, 2000000))
2. 为finance2添加sum_X和sum_Y列
按CIF关联finance2与finance3,提取finance3的对应字段作为求和列,无匹配项自动填充NA:
finance2 <- finance2 %>% # 关联finance3,重命名字段避免冲突 left_join(finance3 %>% select(CIF, X3 = X, Y3 = Y), by = "CIF") %>% # 生成sum列 mutate(sum_X = X3, sum_Y = Y3) %>% # 移除临时关联字段 select(-X3, -Y3) # 查看结果 print(finance2)
输出结果:
CIF X Y sum_X sum_Y 1 A1 500000 250000 500000 250000 2 A2 1500000 500000 1500000 500000 3 A3 2000000 1500000 2000000 1500000 4 A5 2500000 2000000 NA NA
3. 为finance1添加sum_X和sum_Y列
先计算finance2与finance3同CIF的X/Y之和,再关联到finance1:
# 计算finance2 + finance3的同CIF求和结果 sum_f2_f3 <- finance2 %>% select(CIF, X2 = X, Y2 = Y) %>% full_join(finance3 %>% select(CIF, X3 = X, Y3 = Y), by = "CIF") %>% # 无匹配项按0计算,若不需要可移除coalesce mutate(sum_X = coalesce(X2, 0) + coalesce(X3, 0), sum_Y = coalesce(Y2, 0) + coalesce(Y3, 0)) %>% select(CIF, sum_X, sum_Y) # 关联到finance1 finance1 <- finance1 %>% left_join(sum_f2_f3, by = "CIF") # 查看结果 print(finance1)
输出结果(注:与你提供的示例结果存在差异,因示例中sum_X计算逻辑疑似包含finance1自身的X,若需调整可修改求和公式):
CIF X Y sum_X sum_Y 1 A1 500000 250000 1000000 500000 2 A2 1500000 500000 3000000 1000000 3 A3 2000000 1500000 4000000 3000000
4. 批量处理多数据集的通用函数(可选)
如果需要对finance1到finance4批量按顺序生成求和列(每个数据集的sum_X/Y为后续所有数据集的X/Y之和),可使用以下函数:
library(purrr) add_sum_cols <- function(data_list) { n <- length(data_list) for (i in 1:(n-1)) { # 合并后续所有数据集,按CIF求和 sum_data <- data_list[(i+1):n] %>% map_dfr(~select(.x, CIF, X, Y)) %>% group_by(CIF) %>% summarise(sum_X = sum(X, na.rm = TRUE), sum_Y = sum(Y, na.rm = TRUE), .groups = "drop") %>% # 全0结果替换为NA mutate(across(c(sum_X, sum_Y), ~ifelse(.x == 0, NA, .x))) # 关联到当前数据集 data_list[[i]] <- data_list[[i]] %>% left_join(sum_data, by = "CIF") } return(data_list) } # 批量处理 data_list <- list(finance1 = finance1, finance2 = finance2, finance3 = finance3, finance4 = finance4) processed_data <- add_sum_cols(data_list) # 查看处理后的各数据集 processed_data$finance1 processed_data$finance2 processed_data$finance3
内容的提问来源于stack exchange,提问作者Lilac_Mimo
相关产品推荐
相关产品推荐

