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
相关产品推荐
相关产品推荐

