R语言按公司-年度分组统计两列行业标识的跨列唯一值数量
分组统计跨列去重计数实现方案
你原代码的核心问题是across()会对选中的每一列单独执行计算,仅统计单列内部的唯一值,没有合并两列的取值后再全局去重,因此无法得到跨列的去重总数。
正确dplyr实现代码
直接在分组内将两列的取值拼接为一个向量,再调用n_distinct()计数即可,注意你原代码里的管道符书写有误,正确的管道符是%>%:
library(dplyr) Segments %>% group_by(gvkey, Year) %>% summarise( n_unique = n_distinct(c(SICS1, SICS2)), .groups = "drop" )
运行后输出结果和你的预期完全一致:
# A tibble: 4 × 3 gvkey Year n_unique <int> <int> <int> 1 1209 2017 3 2 1209 2018 6 3 1503 2017 3 4 1503 2018 3
扩展适配场景
如果后续需要统计更多连续列的跨列去重值,可以把c(SICS1, SICS2)替换为c_across(SICS1:SICS2),支持和across()一致的列选择语法,列数较多时写法更简洁:
Segments %>% group_by(gvkey, Year) %>% summarise( n_unique = n_distinct(c_across(starts_with("SICS"))), # 自动选中所有SICS开头的行业列 .groups = "drop" )
原方法错误原因
- 原写法
across(SICS1:SICS2, n_distinct)会返回两列结果,分别是SICS1列内的去重数、SICS2列内的去重数 - 直接将两个结果相加时,同时出现在SICS1和SICS2中的行业编码会被重复计数,比如示例中1209公司2017年的3569同时出现在两列,加总会得到2+2=4的错误结果,和真实去重数3不符
内容的提问来源于stack exchange,提问作者HlmlVrlrn
相关产品推荐
相关产品推荐

