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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:20:54