如何将公式应用于数据框中的每个值?

时间:2020-10-20 15:36:00

标签: r dataframe

我创建了一个公式来计算数据的指数移动平均值:

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”时出错:选择了未定义的列

我可以打印所需的答案,但不能创建数据框...

你能帮我吗?

2 个答案:

答案 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)

是有益的