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

如何在含多站点与不连续年份的数据框中计算年变化率?

按站点计算考虑年份间隔的年变化率

示例数据集

siteyearvalue
site_1200010
site_1200115
site_1200423
site_1200620
site_220019
site_220029
site_2200715
site_2200816
site_2201017

原有的rate函数仅计算连续行的value差值,未考虑年份间隔,无法得到你需要的年变化率((终值-初值)/年数)。下面提供两种可行方案:


方案一:用dplyr包实现(推荐,代码简洁易读)

先加载dplyr包,按站点分组后,结合lag()函数计算相邻记录的value变化量和年份间隔,再相除得到年变化率:

library(dplyr)

# 处理数据
df <- df %>%
  group_by(site) %>%
  arrange(year) %>%  # 确保数据按年份排序(如果原始数据未排序)
  mutate(
    rate_change = (value - lag(value)) / (year - lag(year))
  ) %>%
  ungroup()

运行后,每组第一行因无前置数据返回NA,其余行的rate_change即为考虑年份间隔的年变化率。比如site_1第二行是(15-10)/(2001-2000)=5,第三行是(23-15)/(2004-2001)≈2.67,完全符合预期。


方案二:用Base R实现

如果不想加载额外包,可通过by函数按站点分组处理后合并结果:

# 按site分组计算
processed_list <- by(df, df$site, function(sub_df) {
  # 先按年份排序子数据集
  sub_df_sorted <- sub_df[order(sub_df$year), ]
  # 计算年变化率,第一行设为NA
  sub_df_sorted$rate_change <- c(NA, diff(sub_df_sorted$value) / diff(sub_df_sorted$year))
  return(sub_df_sorted)
})

# 合并所有分组结果为一个数据框
df <- do.call(rbind, processed_list)

也可以用ave结合自定义函数实现:

# 自定义计算年变化率的函数
calc_annual_rate <- function(val, yr) {
  # 按年份排序
  sort_idx <- order(yr)
  val_sorted <- val[sort_idx]
  yr_sorted <- yr[sort_idx]
  
  # 计算差值
  val_diff <- diff(val_sorted)
  yr_diff <- diff(yr_sorted)
  
  # 生成结果向量,第一位置为NA
  result <- rep(NA, length(val))
  result[-1][sort_idx] <- val_diff / yr_diff
  
  return(result)
}

# 应用到整个数据框
df$rate_change <- ave(df$value, df$site, FUN = function(x) calc_annual_rate(x, df$year[df$site == unique(df$site)]))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:52:51