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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:42:22