问题描述
我有一个想要按组运行的 for 循环。我希望它遍历一组数据,为大多数行创建一个时间序列,然后在组中输出该行数据的预测(基于该时间点及其之前的)我遇到的问题是为我的数据中的每个“组”运行该循环。我想避免手动执行此操作,因为这会花费数小时,而且肯定有更好的方法。
让我更详细地解释一下。
我有一个大数据集(160 万行),每一行都有一个年份、A 国、B 国以及一些涉及两者之间关系的度量。
到目前为止,我已经成功地将单个(A 国、B 国)关系提取到新表中,并使用 for 循环将必要的预测数据输出到数据集中的新变量。我想创建一个 for 循环,在每个(A 国、B 国)分组中运行超过 3 个条目。
数据:
在这里,我将复制一小部分数据,并将包含一个缺失值以求真实。
set.seed(2000)
df <- data.frame(year = rep(c(1946:1970),length.out=50),ccode1 = rep(c("2"),length.out = 50),ccode2 = rep(c("20","31"),each=25),kappavv = rnorm(50,mean = 0,sd=0.25),output = NA)
df$kappavv[12] <- NA
我所做的:
注意:我从每组的第三个数据点开始预测,但基于预测之前的所有时间点。
for(i in 3:nrow(df)){
dat_ts <- ts(df[,4],start = c(min(df$year),1),end = c(df$year[i],frequency = 1)
dat_ts_corr <- na_interpolation(dat_ts)
trialseries <- holt(dat_ts_corr,h=1)
df$output[i] <- trialseries$mean
}
当我将它应用于 ccode1 和 ccode2 的单个配对时,如果按年份的升序正确排列,这部分可以工作并输出我想要的内容。
什么不起作用:
我遇到了一些严重的问题,无法通过将 ccode2 分组来应用此 for 循环。我的一些数据是不均匀的:有时组的大小不同,起点/终点不同,并且存在数据缺失。
我尝试将循环表示为一个函数,使用 group_by() 和管道,使用各种类型的 apply() 函数。
感谢您的帮助。提前致谢。我很高兴回答您提出的任何澄清问题。
解决方法
您可以将 for
循环代码放入函数中。
library(dplyr)
library(purrr)
apply_func <- function(df) {
for(i in 3:nrow(df)){
dat_ts <- ts(df[,4],start = c(min(df$year),1),end = c(df$year[i],frequency = 1)
dat_ts_corr <- imputeTS::na_interpolation(dat_ts)
trialseries <- forecast::holt(dat_ts_corr,h=1)
df$output[i] <- trialseries$mean
}
return(df)
}
按 ccode2
拆分数据并应用 apply_func
。
df %>%group_split(ccode2) %>% map_df(apply_func)
# year ccode1 ccode2 kappavv output
# <int> <chr> <chr> <dbl> <dbl>
# 1 1946 2 20 -0.213 NA
# 2 1947 2 20 -0.0882 NA
# 3 1948 2 20 0.223 0.286
# 4 1949 2 20 0.435 0.413
# 5 1950 2 20 0.229 0.538
# 6 1951 2 20 -0.294 0.477
# 7 1952 2 20 -0.485 -0.675
# 8 1953 2 20 0.524 0.405
# 9 1954 2 20 0.0564 0.0418
#10 1955 2 20 0.294 0.161
# … with 40 more rows