使用for循环提取子串并匹配DataFrame计算对应成本的技术问询
解决方案:基于For循环实现Zone适配的成本计算
我来帮你实现这个需求,完全用for循环来适配不同的zone取值,步骤清晰且符合你的要求:
首先,先确认我们的输入数据
先构造你提供的两个DataFrame:
# 构造df1 zone = c("A", "B", "C") country_name = c("Canada and UK", "UK and USA", "USA and Canada and UK") df1 = data.frame(zone, country_name, stringsAsFactors = FALSE) # 构造df2 zone_area = c("A", "A", "A", "B", "B", "B", "C", "C", "C") country_name = c("Canada", "UK", "USA", "Canada", "UK", "USA", "Canada", "UK", "USA") cost = c(4, 8, 6, 5, 6, 9, 8, 7, 5) df2 = data.frame(zone_area, country_name, cost, stringsAsFactors = FALSE)
核心实现代码(基于For循环)
下面的代码严格遵循你要求的步骤,并且完全适配任意zone取值的变化:
# 初始化目标DataFrame df3,复制df1的基础结构,先将cost列设为0 df3 = df1 df3$cost = 0 # 获取所有唯一的zone值,确保循环能覆盖所有可能的zone unique_zones = unique(df1$zone) # 外层循环:遍历每个独立的zone for (current_zone in unique_zones) { # 找到df1中当前zone对应的所有行的索引 target_rows = which(df1$zone == current_zone) # 内层循环:处理当前zone下的每一行数据 for (row_idx in target_rows) { # 提取当前行country_name中的所有国家子串 country_list = unlist(strsplit(df1$country_name[row_idx], " and ")) # 从df2中匹配当前zone对应的国家成本,构建映射关系 zone_cost_data = df2[df2$zone_area == current_zone, ] country_to_cost = setNames(zone_cost_data$cost, zone_cost_data$country_name) # 计算当前行所有国家的成本总和 total_cost = sum(country_to_cost[country_list]) # 将结果赋值给df3对应行的cost列 df3$cost[row_idx] = total_cost } } # 查看最终结果 print(df3)
代码解释
- 初始化df3:直接复制df1的
zone和country_name列,确保结构和目标一致,先把cost列初始为0用于后续填充。 - 遍历唯一zone:通过
unique(df1$zone)获取所有独立的zone,不管后续zone新增或修改,循环都能自动适配。 - 提取国家子串:用
strsplit按" and "分割字符串,再用unlist转成向量,方便后续匹配。 - 构建成本映射:从df2中筛选当前zone的成本数据,用
setNames创建“国家-成本”的命名向量,快速完成匹配。 - 计算总成本:直接通过命名向量索引获取每个国家的成本,求和后赋值给df3对应行。
运行结果
执行代码后,你会得到完全符合要求的df3:
zone country_name cost 1 A Canada and UK 12 2 B UK and USA 15 3 C USA and Canada and UK 20
内容的提问来源于stack exchange,提问作者Runner
相关产品推荐
相关产品推荐

