如何用R按ID和年份计算面板数据当前值与起始值的比率
按ID计算面板数据的当期Value与起始Value比值(Ratio)
核心思路
先确保每组(按ID)内的数据按时间顺序排列,提取每组起始期的Value作为基准,最后用当期Value除以该基准得到Ratio。
Python(Pandas)实现
1. 构造示例数据
import pandas as pd data = { 'ID': [1,1,1,2,2,2], 'Value': [10,12,13,20,25,22], 'Year': [2020,2021,2022,2020,2021,2022], 'Qtr': [1,1,1,1,1,1] } df = pd.DataFrame(data)
2. 排序并计算Ratio
# 按ID、Year、Qtr排序,保证每组内数据按时间顺序排列 df = df.sort_values(by=['ID', 'Year', 'Qtr']) # 按ID分组,提取每组第一个Value作为起始基准值 df['Start_Value'] = df.groupby('ID')['Value'].transform('first') # 计算Ratio df['Ratio'] = df['Value'] / df['Start_Value']
处理后结果
ID Value Year Qtr Start_Value Ratio 0 1 10 2020 1 10 1.0 1 1 12 2021 1 10 1.2 2 1 13 2022 1 10 1.3 3 2 20 2020 1 20 1.0 4 2 25 2021 1 20 1.25 5 2 22 2022 1 20 1.1
R语言(dplyr)实现
library(dplyr) # 构造示例数据 df <- data.frame( ID = c(1,1,1,2,2,2), Value = c(10,12,13,20,25,22), Year = c(2020,2021,2022,2020,2021,2022), Qtr = c(1,1,1,1,1,1) ) # 排序并计算Ratio df <- df %>% arrange(ID, Year, Qtr) %>% group_by(ID) %>% mutate(Start_Value = first(Value), Ratio = Value / Start_Value) %>% ungroup()
注意事项
- 必须先按
ID+Year+Qtr排序,否则可能取到非起始期的Value作为基准,导致结果错误。 - 如果同一ID存在重复时间记录,需先处理重复值,确保每个ID的每个时间点仅一条数据。
内容的提问来源于stack exchange,提问作者avid_learner
相关产品推荐
相关产品推荐

