在应用某些函数后,获得原始源 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 个因素的列(a
、b
、c
、d
、e
) 和 2 列值 (values1
,values2
)。我想应用一些考虑到每一列值的函数(在本例中首先是 auto.arima
和 forecast.Arima
)。要播放的数据集如下:
library(forecast)
set.seed(2)
dat <- data.frame(factors = letters[1:5],values1 = rnorm(50), values2 =rnorm(50))
这个先前的数据集有一列包含 5 个因子(a
、b
、c
、d
、e
),以及 2 列值(values1
、values2
)。我想(为了练习)对每个因子应用 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 个值)因此允许您将 values1
和 values2
分开。
您可以使用 unlist(x, recursive=FALSE)
将其展平为 10 个列表。
这个问题我已经有一段时间了。
我想要的是将函数应用于除以因子的 data.frame。此数据框有 n>2 列我需要用于此功能的值。
为了这个例子,这个数据集有一个包含 5 个因素的列(a
、b
、c
、d
、e
) 和 2 列值 (values1
,values2
)。我想应用一些考虑到每一列值的函数(在本例中首先是 auto.arima
和 forecast.Arima
)。要播放的数据集如下:
library(forecast)
set.seed(2)
dat <- data.frame(factors = letters[1:5],values1 = rnorm(50), values2 =rnorm(50))
这个先前的数据集有一列包含 5 个因子(a
、b
、c
、d
、e
),以及 2 列值(values1
、values2
)。我想(为了练习)对每个因子应用 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 个值)因此允许您将 values1
和 values2
分开。
您可以使用 unlist(x, recursive=FALSE)
将其展平为 10 个列表。