簡體   English   中英

如何將公式應用於數據框中的每個值?

[英]How do I apply a formula to each value in a data frame?

我創建了一個公式來計算數據的指數移動平均值:

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)) 中的錯誤:在選擇函數“mean”的方法時評估參數“x”時出錯:選擇了未定義的列

我可以打印我想要的答案,但不能創建數據框...

你能幫助我嗎?

首先myEMA()是一個函數,而不是一個公式。 查看help("function")help("formula")以了解區別的詳細信息。

myEMA()函數將一個數值向量作為它的第一個參數,並返回一個與它的第一個參數具有相同維度的數值向量。

data.frame對象data.frame只是具有特殊類屬性的向量列表。 在列表中的每個元素上重復函數調用的最常見方法是使用*apply函數系列之一。 例如,您可以使用lapply() ,它將對 priceupdated 中的每個變量調用一次pricesupdated並返回一個列表,每個函數調用包含一個元素,其中包含該函數調用的返回值(一個數字向量)。 這個列表可以很容易地轉換回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

這個問題可能是重復的,...但apply -family 可能會有所幫助,例如

sapply(pricesupdated, myEMA, n=12)

為了可重復性,添加require(pec)將是有益的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM