【发布时间】:2021-09-11 23:23:49
【问题描述】:
一个完全可重现的例子。现在的问题是创建的新列在所有值的 c() 中,而不是每个值都在其单独的行中。
date = seq(as.Date("2019/01/01"), by = "month", length.out = 48)
productB = rep("B",48)
productB = rep("B",48)
productA = rep("A",48)
productA = rep("A",48)
subproducts1=rep("1",48)
subproducts2=rep("2",48)
subproductsx=rep("x",48)
subproductsy=rep("y",48)
b1 <- c(rnorm(30,5), rep(0,18))
b2 <- c(rnorm(30,5), rep(0,18))
b3 <-c(rnorm(30,5), rep(0,18))
b4 <- c(rnorm(30,5), rep(0,18))
在下面创建了数据框
dfone <- data.frame("date"= rep(date,4),
"product"= c(rep(productB,2),rep(productA,2)),
"subproduct"=
c(subproducts1,subproducts2,subproductsx,subproductsy),
"actuals"= c(b1,b2,b3,b4))
export_df <- split(dfone[1:4], dfone[3])
# Creation of data frames based off UNIQUE SUBPRODUCTS
dummy_list <- split(dfone[1:4], dfone[3]) %>% lapply( function(x)
x[(names(x) %in% c("date", "actuals"))])
dummy_list <- lapply(dummy_list, function(x) { x["date"] <- NULL; x })
list_dfs <- list()
for (i in 1:length(unique(dfone$subproduct))) {
#assign(paste0("df", i), as.data.frame(dummy_list[[i]]))
list_dfs <-append(list_dfs,dummy_list[[i]])
}
combined_dfs <- Reduce(function(x, y) merge(x, y, all = TRUE,
by='date'), list(list_dfs))
创建时间序列
list_ts <- lapply(list_dfs, function(t)
ts(t,start=c(2019,1),end=c(2021,6), frequency = 12)) %>%
lapply( function(t) ts_split(t,sample.out=(0.2*length(t)))) #
creates my train test split
list_ts <- do.call("rbind", list_ts) #Creates a list of time series
创建模型
model_tune_ses1 <- lapply(list_ts[1:(length(list_ts)/2)], function(x)
forecast::forecast(ses(x,h=24,alpha=0.1)))
model_tune_ses1 <- lapply(model_tune_ses1, "[", c("mean"))
model_tune_ses2 <- lapply(list_ts[1:(length(list_ts)/2)], function(x)
forecast::forecast(ses(x,h=24,alpha=0.2)))
model_tune_ses2 <- lapply(model_tune_ses2, "[", c("mean"))
model_trp_holt_mult <- lapply(list_ts[1:(length(list_ts)/2)],
function(x)
forecast::forecast( HoltWinters(x,seasonal="multiplicative"),h=24))
model_trp_holt_mult <- lapply(model_trp_holt_mult, "[", c("mean"))
lst1 <- do.call(Map, c(f = cbind, mget(ls(pattern = 'model_'))))
export_df1 <- Map(cbind, export_df, lst1)
export_df1 <- bind_rows(export_df1, .id = "date")
我已删除其他编辑以节省更多空间。
编辑2:
export_df1[[6]]
[[1]]
Jan Feb Mar Apr May Jun Jul Aug
Sep Oct Nov Dec
2021 6.508872 4.639274 4.678671 4.626766 5.327353 6.890269 6.640483
6.164311 5.317675 6.152747 5.963053 5.243159
2022 6.517052 4.645104 4.684550 4.632579 5.334046 6.898923 6.648823
6.172052 5.324353 6.160472 5.970540 5.249740
export_df1[[6]]
[[2]]
Jan Feb Mar Apr May Jun Jul Aug
Sep Oct Nov Dec
2021 6.508872 4.639274 4.678671 4.626766 5.327353 6.890269 6.640483
6.164311 5.317675 6.152747 5.963053 5.243159
2022 6.517052 4.645104 4.684550 4.632579 5.334046 6.898923 6.648823
6.172052 5.324353 6.160472 5.970540 5.249740
我不希望将数据框中的每一行都作为所有这些值的列表,而是希望列如下所示。
export_df1$actuals
[1] 4.729682 4.573595 7.338069 4.742559 5.853501 3.167612 6.305137
5.879437 4.571004 5.367115 5.127305 4.552428 5.843000 4.060205 4.125869
4.190687
[17] 4.894595 6.454123 4.686262 4.196005 7.289879 6.206924 6.191610
6.100175 4.769656 4.829249 5.287280 4.425435 5.158180 4.402173 0.000000 0.000000 等
【问题讨论】:
-
我已经更新了帖子,是的,这是真的,所以这是我想在向量的输出匹配我的每个部分的长度 48 之前添加一个 0 的向量数据框。或者我们可以将 0 保留为 null 应该没问题,但它必须位于下半部分,而不是列的前半部分,例如 (0,0,0,0,........the从列的列表中输出)
-
请查看mmy更新
-
去测试我的真实代码看看会发生什么,但是在虚拟代码上这工作得很好。你是天才
-
这非常有效。非常感谢你的帮助。想知道你是如何在 R 方面如此出色的,其中一些功能我以前从未听说过。有什么技巧/书籍可以阅读吗?
-
我会说这就是你将如何学习 :=) 即艰难地学习。说真的,网上有很多书可以看,但在编程中,是靠自己的实践和调试来提高技能的。一开始可能听起来很难,但相信我,以后会更容易
标签: r dataframe data-manipulation