在应用某些函数后,获得原始源 X 倍的 data.frame(或列表)

Obtain a data.frame (or list) of X times the the original source, after applying some function

这个问题我已经有一段时间了。

我想要的是将函数应用于除以因子的 data.frame。此数据框有 n>2 列我需要用于此功能的值。

为了这个例子,这个数据集有一个包含 5 个因素的列(abcde ) 和 2 列值 (values1,values2)。我想应用一些考虑到每一列值的函数(在本例中首先是 auto.arimaforecast.Arima)。要播放的数据集如下:

library(forecast)
set.seed(2)
dat <- data.frame(factors = letters[1:5],values1 = rnorm(50), values2 =rnorm(50))

这个先前的数据集有一列包含 5 个因子(abcde),以及 2 列值(values1values2)。我想(为了练习)对每个因子应用 auto.arima 到值 1 和值 2。我的预期输出将是 something ,每个因素都会考虑两列值,并预测两列(每个作为其自己的单变量时间序列)。因此,如果数据集有 5 个因子和 2 列值,我需要 10 lists/data.frames.

一些不起作用的选项:通过以下方式拆分 data.frame 每个因素:

split(dat, dat$factor)

然后使用rapply:

rapply(dat,function(x) forecas.Arima(auto.arima(x)),dat$factors)

lapply:

lapply(split(dat,dat$factors), function(x) forecast.Arima(auto.arima(x)))

还有其他一些组合,都无济于事。

我认为最简单的解决方案是涉及 apply 系列中的函数,但任何解决方案都是有效的。

这是您要找的吗?

m = melt(dat, id.vars = "factors")
l = split(m, paste(m$factors, m$variable))
lapply(l, function(x) forecast.Arima(auto.arima(x$value)))

即将数据分成 10 个不同的帧,然后在 values?

上应用预测

apply 解决方案的问题是你将整个数据帧传递给 auto.arima 函数,该函数采用向量,所以你需要这样的东西:

lapply(split(dat,dat$factors), function(df) {
    apply(df[,-1], 2, function(col) forecast.Arima(auto.arima(col)))
})

这会像以前一样在因子上拆分数据框,然后将 forecast.Arima 中包含的 auto.arima 函数应用于每一列(忽略第一列,即因子)。这个 returns 列表列表(5 个因子乘以 2 个值)因此允许您将 values1values2 分开。

您可以使用 unlist(x, recursive=FALSE) 将其展平为 10 个列表。