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

R语言使用dplyr按年份和企业ID分组统计dummy变量频率问题求解

问题原因
  • 核心错误是deslig字段的计算逻辑偏差:你当前代码的sum(empem3112[empem3112==0])是对筛选出的empem3112=0的数值本身求和,所有参与计算的值都是0,求和结果自然永远为0,并非统计符合条件的记录条数。
  • 额外冗余问题:empreg和total的计算逻辑也不规范:
    • empreg当前结果正确是dummy变量的特性巧合:取值为1时求和结果刚好等于记录条数,并非通用的频率统计写法
    • total用sum(empem3112)只能得到就业状态为1的总条数,无法得到该分组下的所有记录总数,若要统计总条数应该用n()函数
  • 额外注意:你样例数据中年份变量名为year,代码中分组用的是ano,如果数据集变量名不一致也可能导致统计错误,按需调整即可。
修正代码

直接利用R中逻辑值TRUE=1、FALSE=0的特性,对判断条件求和即可得到符合条件的记录数:

teste = rais2009 %>%
  group_by(year, cnpjcei) %>% # 若数据集年份变量为ano则改为group_by(ano, cnpjcei)
  summarise(
    total = n(), # 统计该分组下总记录数
    empreg = sum(empem3112 == 1), # 统计就业状态为1的条数
    deslig = sum(empem3112 == 0), # 统计就业状态为0的条数
    .groups = "drop" # 统计完成后自动取消分组,避免后续操作出现分组警告
  )

按你提供的样例数据运行后,企业4774对应的deslig值会正确返回2,符合预期。

可选扩展写法

如果需要生成长格式的统计结果,也可以用count函数一步实现:

# 长格式结果:每个分组+每个就业状态对应一行,freq为出现频率
teste_long = rais2009 %>%
  count(year, cnpjcei, empem3112, name = "freq")

内容的提问来源于stack exchange,提问作者user16019366

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:36:03