按ISIN计算各企业Size与ROA年度环比变化时代码返回全0值的问题排查
解决分组计算年度变化值结果全为0的问题
你遇到的这个问题很常见——想用dplyr按企业ISIN分组计算Size和ROA的年度变化,但结果全是0,核心问题出在错误使用了summarise函数,下面给你拆解问题和修正方案:
问题根源
summarise的作用是对每组数据做汇总计算,默认每组只返回一行结果。你在summarise里直接传入year再计算lag(size),会导致函数无法正确识别每组内的行顺序和滞后关系,最终输出的差值全部异常为0。而你需要的是保留每组内的所有年度观测值,同时计算每行相对于上一年的变化,这时候应该用mutate函数。
修正后的代码
df3 <- totassetprice %>% group_by(isin) %>% arrange(year, .by_group = TRUE) %>% # 按ISIN分组后,按年份升序排列 mutate( deltsize = size - lag(size), # 计算当前年份size与上一年的差值 deltroa = roa - lag(roa) # 计算当前年份roa与上一年的差值 ) %>% ungroup() # 可选:如果后续不需要分组操作,取消分组
代码细节解释
group_by(isin):按企业ISIN分组,确保后续计算都是在单个企业的年度数据范围内进行arrange(year, .by_group = TRUE):每组内按年份排序,保证lag()能正确取到上一年的对应数据mutate():在原数据基础上新增计算列,保留所有原始行(每组的第一行因为没有上一年数据,会返回NA;如果需要把NA替换为0,可以改成deltsize = replace_na(size - lag(size), 0))
测试示例结果
用你提供的JP3304200003测试数据,运行修正后的代码会得到正确的变化值:
isin year size roa deltsize deltroa JP3304200003 2009 9.617923 0.12711757 NA NA JP3304200003 2010 9.649482 0.08083183 0.031559 -0.04628574 JP3304200003 2011 9.811475 0.14535881 0.161993 0.06452698 ...
内容的提问来源于stack exchange,提问作者thomas.diridondo
相关产品推荐
相关产品推荐

