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

按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()  # 可选:如果后续不需要分组操作,取消分组

代码细节解释

  1. group_by(isin):按企业ISIN分组,确保后续计算都是在单个企业的年度数据范围内进行
  2. arrange(year, .by_group = TRUE):每组内按年份排序,保证lag()能正确取到上一年的对应数据
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 01:02:34