如何从DataFrame按IND_LOC分组生成时间序列列表?
解决方案:将分组DataFrame转换为命名时间序列列表
没问题,这可以通过R的dplyr和zoo包轻松实现,下面是完整的步骤和代码:
1. 加载必要的包
首先确保你已经安装了这些包,然后加载它们:
library(dplyr) library(zoo)
2. 定义时间序列转换函数
我们先写一个辅助函数,用来把单个分组的数据转换成标准的时间序列(ts对象):
convert_to_ts <- function(group_data, value_col = "total_this_month") { # 从yearmon类型中提取起始年份和月份 ym_values <- group_data$year_month start_year <- as.integer(floor(ym_values)) start_month <- as.integer(12 * (ym_values - floor(ym_values)) + 1) # 创建月度时间序列(频率设为12) ts( data = group_data[[value_col]], start = c(start_year[1], start_month[1]), frequency = 12 ) }
3. 生成目标时间序列列表
假设你的DataFrame名为df,执行以下代码即可生成以IND_LOC值命名的时间序列列表:
time_series <- df %>% # 按IND_LOC拆分成多个分组数据框 group_split(IND_LOC) %>% # 给列表的每个元素设置对应的IND_LOC名称 set_names(unique(df$IND_LOC)) %>% # 对每个分组应用转换函数 lapply(convert_to_ts)
4. 验证结果
执行str(time_series)就能看到和你示例一致的结构,比如:
> str(time_series) List of 89 $ 1_1: Time-Series [1:N] from YYYY to YYYY: ... $ 1_2: Time-Series [1:N] from YYYY to YYYY: ... ... $ 8_9: Time-Series [1:6] from 2013 to 2013: 3960268 3051909 3504636 3234451 3409146 3619219
5. 切换数值列(可选)
如果你想基于mean_this_month生成时间序列,只需要在调用函数时指定value_col参数:
time_series_mean <- df %>% group_split(IND_LOC) %>% set_names(unique(df$IND_LOC)) %>% lapply(convert_to_ts, value_col = "mean_this_month")
内容的提问来源于stack exchange,提问作者Davide Lorino
相关产品推荐
相关产品推荐

