使用tidyverse按国家-年份-行业计算增长率却得到零值的问题
问题排查与解决
错误原因
你的代码核心问题出在分组逻辑错误:
你用group_by(country, year, sector)进行分组,这会把每个country-year-sector的唯一组合单独划分为一个组,每组仅包含1条数据。此时lag(sector_share)无法获取到同组内的前序年份数据,结果全为NA,触发ifelse的else分支,导致所有growth_rate被设为0。
修正后的代码
要计算同一国家同一行业在不同年份的增长率,应该按country和sector分组,确保同国家同行业的所有年份数据处于同一组内,再按year排序后计算增长率:
sa1 <- sa1 %>% group_by(country, sector) %>% # 仅按国家和行业分组 arrange(year) %>% # 组内按年份排序 mutate( growth_rate = ifelse( !is.na(lag(sector_share)), (sector_share / lag(sector_share) - 1) * 100, 0 # 第一年无前置数据时设为0,也可根据需求改为NA ) ) %>% ungroup() # 可选:完成计算后取消分组,避免后续操作受分组影响
补充说明
- 如果希望第一年的增长率显示为
NA而非0,只需把ifelse的第三个参数改为NA_real_即可。 - 确认你的
year字段是连续的数值型(比如2010、2011...),如果存在年份间隔,lag会取上一条记录的值,而非严格意义上的前一年,这种情况可能需要额外处理(比如用complete补全年份)。
内容的提问来源于stack exchange,提问作者timeseriescry
相关产品推荐
相关产品推荐

