如何基于df1的State列计算df2中各ID对应的Perc值总和?
实现R语言数据框多州匹配求和的方法
数据定义
原始数据框定义如下:
library(dplyr) State = c('AK','AL','AR','AZ') Perc = c(0.0023, 0.0034, 0.0043, 0.065) df1 <- data.frame(State, Perc) ID = c('A','B','C','D','E') States = c('AK','AK; AL', 'AK; AL; AR; AZ', 'AR; AZ', 'AL') df2 <- data.frame(ID, States)
需求说明
需要在df2中新增SumPerc列,该列根据df2$States中以分号分隔的州名称,匹配df1$State对应的Perc值并求和,最终结果需与示例一致。
实现方法
方法一:dplyr + tidyr 流程化处理
通过拆分多值列、关联匹配、分组聚合的步骤实现,逻辑清晰:
library(dplyr) library(tidyr) df_result <- df2 %>% # 将分号分隔的州拆分为多行,保留ID关联 separate_rows(States, sep = "; ") %>% # 关联df1获取对应州的Perc值 left_join(df1, by = c("States" = "State")) %>% # 按ID分组,同时保留原始的States字符串 group_by(ID, States = df2$States[match(ID, df2$ID)]) %>% # 对Perc求和,na.rm避免无匹配时出错 summarise(SumPerc = sum(Perc, na.rm = TRUE), .groups = "drop") %>% # 按原始ID顺序排序,确保结果顺序一致 arrange(match(ID, df2$ID)) %>% # 格式化小数位数,与示例结果对齐 mutate(SumPerc = round(SumPerc, 4)) print(df_result)
方法二:base R 轻量实现
无需额外加载包,通过自定义函数结合sapply完成:
# 定义求和函数:输入州字符串,返回对应Perc的总和 calc_sum_perc <- function(state_str) { # 拆分字符串并去除多余空格 state_list <- trimws(strsplit(state_str, ";")[[1]]) # 匹配df1中的州并求和 sum(df1$Perc[df1$State %in% state_list], na.rm = TRUE) } # 给df2新增SumPerc列 df2$SumPerc <- sapply(df2$States, calc_sum_perc) # 格式化小数位数 df2$SumPerc <- round(df2$SumPerc, 4) print(df2)
内容的提问来源于stack exchange,提问作者user2813606
相关产品推荐
相关产品推荐

