如何在R语言中基于年份与行业代码匹配最小ROA差值的公司并生成diff_min_firmcode列
在R中实现分组内匹配最接近ROA的公司代码
嗨,这个需求其实是分组内寻找邻近匹配值的典型场景,在R里我们可以借助dplyr的分组能力加上自定义函数轻松实现。下面是完整的解决方案,包括示例数据构造、核心代码和鲁棒性优化:
1. 构造示例数据
首先我们先还原你提供的示例数据框,方便后续测试:
# 构造与题目一致的示例数据框 df <- data.frame( index = 0:7, firmcode = c("a", "b", "c", "d", "e", "f", "g", "h"), year = rep(2006, 8), indcode = c(rep("03", 4), rep("07", 4)), ROA = c(0.1, 0.2, 0.4, 0.7, 0.3, 0.8, 1.1, 2.1) )
2. 基础实现代码
我们可以用dplyr进行分组,再结合自定义函数找到每个公司在同组内排除自身后ROA最接近的公司:
library(dplyr) library(purrr) # dplyr通常会自动加载purrr,若未加载可手动调用 # 定义自定义函数:在分组内排除当前行后,找到ROA最接近的公司代码 find_closest_firm <- function(current_roa, group_roa, group_firm) { # 排除当前行对应的条目 filtered_roa <- group_roa[group_roa != current_roa] filtered_firm <- group_firm[group_roa != current_roa] # 计算绝对差值,找到最小差值对应的公司代码 min_diff_pos <- which.min(abs(filtered_roa - current_roa)) return(filtered_firm[min_diff_pos]) } # 分组处理生成目标列 result_df <- df %>% group_by(year, indcode) %>% mutate(diff_min_firmcode = map2_chr(ROA, list(ROA), list(firmcode), find_closest_firm)) %>% ungroup() # 查看结果 print(result_df)
运行这段代码后,你会得到题目要求的结果,diff_min_firmcode列会正确存储每个公司对应的最接近ROA的同组其他公司代码。
3. 鲁棒性优化(处理同ROA值的情况)
如果你的真实数据中存在同一分组内多个公司ROA值相同的情况,上面的基础版可能会误删多个条目。我们可以通过分组内的行号来精准排除当前行,优化后的代码如下:
# 更鲁棒的自定义函数:通过行号精准排除当前行 find_closest_firm_robust <- function(row_idx, group_roa, group_firm) { # 排除当前行的ROA和公司代码 filtered_roa <- group_roa[-row_idx] filtered_firm <- group_firm[-row_idx] # 寻找最小差值对应的公司代码 min_diff_pos <- which.min(abs(filtered_roa - group_roa[row_idx])) return(filtered_firm[min_diff_pos]) } # 优化后的分组处理 result_df_robust <- df %>% group_by(year, indcode) %>% mutate( group_row_num = row_number(), # 在分组内生成行号 diff_min_firmcode = map2_chr(group_row_num, list(ROA), list(firmcode), find_closest_firm_robust) ) %>% select(-group_row_num) %>% # 移除临时行号列 ungroup()
这个版本通过row_number()在每个分组内生成唯一行号,确保只排除当前行,避免了同ROA值带来的错误。
内容的提问来源于stack exchange,提问作者Jong Eun Chun
相关产品推荐
相关产品推荐

