R语言检测企业相对绩效评估同行组年度变更问题求助
你可以使用tidyverse系列工具完成该需求,无需额外安装专用R包,实现逻辑为按企业+财年聚合同行名单,逐期对比相邻年度的同行集合差异即可生成变更哑变量。
完整实现代码
# 加载依赖包 library(dplyr) library(purrr) # 你的示例数据 CIK <- c("21344","21344", "21344", "21344", "21344", "21344", "21344", "21344", "21344") FiscalYear <- c("2013", "2014", "2015", "2016", "2017", "2014", "2015", "2016", "2017") PeerCIK <- c("1800","1800","1800","1800","1800","21456","21456","21456","21456") dataframe <- data.frame(CIK, FiscalYear, PeerCIK) # 核心计算逻辑 result <- dataframe %>% # 转换年份为数值型,避免排序错误 mutate(FiscalYear = as.numeric(FiscalYear)) %>% # 按企业+财年聚合,存储当年所有同行的集合 group_by(CIK, FiscalYear) %>% summarise(peers = list(unique(PeerCIK)), .groups = "drop") %>% # 按企业分组后按年份排序 group_by(CIK) %>% arrange(FiscalYear, .by_group = TRUE) %>% # 对比当期与上一期的同行集合差异,生成变更哑变量 mutate( last_peers = lag(peers), change = ifelse(is.na(last_peers), 0, as.integer(!map2_lgl(peers, last_peers, setequal))) ) %>% # 保留需要的输出字段 select(CIK, FiscalYear, change) %>% ungroup()
输出结果
运行后打印result即可得到和你预期完全一致的结果:
# A tibble: 5 × 3 CIK FiscalYear change <chr> <dbl> <dbl> 1 21344 2013 0 2 21344 2014 1 3 21344 2015 0 4 21344 2016 0 5 21344 2017 0
如果需要同时统计每一期新增、移除的具体同行ID,只需要在mutate环节增加setdiff(peers, last_peers)、setdiff(last_peers, peers)的计算逻辑即可。
内容的提问来源于stack exchange,提问作者Lisette
相关产品推荐
相关产品推荐

