我创建了一个公式来计算数据的指数移动平均值:
myEMA <- function(price, n) {
ema <- c()
data_start <- which(!is.na(price))[1]
ema[1:data_start+n-2] <- NA
ema[data_start+n-1] <- mean(price[data_start:(data_start+n-1)])
beta <- 2/(n+1)
for(i in (data_start+n):length(price)) {
ema[i] <- beta*price[i] +
(1-beta)*ema[i-1]
}
ema <- reclass(ema,price)
return(ema)
}
我正在使用的数据是:
pricesupdated <- data.frame(a = seq(1,100), b = seq(1,200,2), c = c(NA,NA,NA,seq(1,97)))
我想创建一个数据框,在其中将公式应用于上述data.frame中的每个变量。我的尝试是:
frameddata <- data.frame(myEMA(pricesupdated,12))
但是我收到的错误消息是:
h(simpleError(msg,call))中的错误: 在为函数“均值”选择方法时评估参数“ x”时出错:选择了未定义的列
我可以打印所需的答案,但不能创建数据框...
你能帮我吗?
答案 0 :(得分:0)
首先myEMA()
是一个函数,而不是一个公式。请查看help("function")
和help("formula")
,以了解区别。
myEMA()
函数将数字矢量作为其第一个参数,并返回与第一个参数具有相同尺寸的数字矢量。
data.frame
对象基本上只是具有特殊class属性的向量列表。在列表中的每个元素上重复执行函数调用的最常见方法是使用*apply
函数家族之一。例如,您可以使用lapply()
,它将在pricesupdated
中的每个变量上调用myEMA一次,并返回一个列表,每个函数调用包含一个元素,其中包含该函数调用的返回值(数字矢量)。该列表的所有元素都具有相同的长度,因此可以轻松地转换回data.frame()
:
results <- lapply(pricesupdated, myEMA, n = 12)
# look at the structure of the results object
> str(results)
List of 3
$ a: num [1:100] NA NA NA NA NA NA NA NA NA NA ...
$ b: num [1:100] NA NA NA NA NA NA NA NA NA NA ...
$ c: num [1:100] NA NA NA NA NA NA NA NA NA NA ...
frameddata <- as.data.frame(results)
# look at the top 15 records in this object
> head(frameddata, 15)
a b c
1 NA NA NA
2 NA NA NA
3 NA NA NA
4 NA NA NA
5 NA NA NA
6 NA NA NA
7 NA NA NA
8 NA NA NA
9 NA NA NA
10 NA NA NA
11 NA NA NA
12 6.5 12 NA
13 7.5 14 NA
14 8.5 16 NA
15 9.5 18 6.5
答案 1 :(得分:0)
该问题可能是重复的,...
但是apply
系列可能会有所帮助,例如
sapply(pricesupdated, myEMA, n=12)
为了可重复性,添加require(pec)