создать фрейм данных с несколькими столбцами, которые являются скользящими средними разных окон

У меня есть фрейм данных mydata, который состоит из 2 столбцов: столбца даты и столбца значений. Я хотел бы добавить столбцы к фрейму данных, которые являются скользящей средней столбца «значение» в различных окнах.

В настоящее время mydata имеет 2 столбца

Column 1 - date
Column 2 - value

Мне бы хотелось, чтобы столбец 3 был скользящей средней за 2 периода столбца значений, столбец 4 - скользящей средней за 3 периода столбца значений и т. Д. до последнего столбца скользящая средняя из 9 периодов

поэтому я хотел бы добавить эти столбцы:

Column 3 - SMA(value, 2)
Column 4 - SMA(value, 3)
Column 5 - SMA(value, 4)
Column 6 - SMA(value, 5)
Column 7 - SMA(value, 6)
Column 8 - SMA(value, 7)
Column 9 - SMA(value, 8)
Column 10 - SMA(value, 9)

вот код

library(TTR)
date = seq(as.Date("2016-01-01"),as.Date("2016-01-10"),"day")
value =c(1,2,3,4,5,6,7,8,9,10)
mydata = data.frame (date, value)
z = zoo(value, date)
SMA(z, n=2)# this would be 3rd column of data frame
SMA(z, n=3)# this would be 4th column of data frame

так далее.....

благодарю вас.

Ответы на вопрос(1)

Решение Вопроса

Вы могли бы достичь этого сdata.table пакет иrollmeanr функция (илиrollmean функция) изzoo пакет:

library(data.table)
library(zoo)
# method 1:
setDT(mydata)[, paste0('MA',2:9) := lapply(2:9, function(x) rollmeanr(value, x, fill = NA))][]
# method 2:
setDT(mydata)[, paste0('MA',2:9) := lapply(2:9, rollapplyr, data = value, mean, fill = NA)][]

которые оба дают:

> mydata
          date value MA2 MA3 MA4 MA5 MA6 MA7 MA8 MA9
 1: 2016-01-01     1  NA  NA  NA  NA  NA  NA  NA  NA
 2: 2016-01-02     2 1.5  NA  NA  NA  NA  NA  NA  NA
 3: 2016-01-03     3 2.5   2  NA  NA  NA  NA  NA  NA
 4: 2016-01-04     4 3.5   3 2.5  NA  NA  NA  NA  NA
 5: 2016-01-05     5 4.5   4 3.5   3  NA  NA  NA  NA
 6: 2016-01-06     6 5.5   5 4.5   4 3.5  NA  NA  NA
 7: 2016-01-07     7 6.5   6 5.5   5 4.5   4  NA  NA
 8: 2016-01-08     8 7.5   7 6.5   6 5.5   5 4.5  NA
 9: 2016-01-09     9 8.5   8 7.5   7 6.5   6 5.5   5
10: 2016-01-10    10 9.5   9 8.5   8 7.5   7 6.5   6

В ответ на ваш комментарий вы можете добавитьlog Значения путем цепочки аналогичной операции:

setDT(mydata)[, paste0('MA',2:9) := lapply(2:9, function(x) rollmeanr(value, x, fill = NA))
              ][, paste0('ln',2:9) := lapply(.SD, log), .SDcols = 3:10]

который дает:

> mydata
          date value MA2 MA3 MA4 MA5 MA6 MA7 MA8 MA9       ln2       ln3       ln4      ln5      ln6      ln7      ln8      ln9
 1: 2016-01-01     1  NA  NA  NA  NA  NA  NA  NA  NA        NA        NA        NA       NA       NA       NA       NA       NA
 2: 2016-01-02     2 1.5  NA  NA  NA  NA  NA  NA  NA 0.4054651        NA        NA       NA       NA       NA       NA       NA
 3: 2016-01-03     3 2.5   2  NA  NA  NA  NA  NA  NA 0.9162907 0.6931472        NA       NA       NA       NA       NA       NA
 4: 2016-01-04     4 3.5   3 2.5  NA  NA  NA  NA  NA 1.2527630 1.0986123 0.9162907       NA       NA       NA       NA       NA
 5: 2016-01-05     5 4.5   4 3.5   3  NA  NA  NA  NA 1.5040774 1.3862944 1.2527630 1.098612       NA       NA       NA       NA
 6: 2016-01-06     6 5.5   5 4.5   4 3.5  NA  NA  NA 1.7047481 1.6094379 1.5040774 1.386294 1.252763       NA       NA       NA
 7: 2016-01-07     7 6.5   6 5.5   5 4.5   4  NA  NA 1.8718022 1.7917595 1.7047481 1.609438 1.504077 1.386294       NA       NA
 8: 2016-01-08     8 7.5   7 6.5   6 5.5   5 4.5  NA 2.0149030 1.9459101 1.8718022 1.791759 1.704748 1.609438 1.504077       NA
 9: 2016-01-09     9 8.5   8 7.5   7 6.5   6 5.5   5 2.1400662 2.0794415 2.0149030 1.945910 1.871802 1.791759 1.704748 1.609438
10: 2016-01-10    10 9.5   9 8.5   8 7.5   7 6.5   6 2.2512918 2.1972246 2.1400662 2.079442 2.014903 1.945910 1.871802 1.791759
 Jaap02 июн. 2016 г., 23:04
@ user3022875 Вы можете использовать, например,mydata[, paste0('ln',2:9) := lapply(.SD, log), .SDcols = 3:10], Это то, что вы ищете?
 Jaap02 июн. 2016 г., 22:32
HTH = Надежда, которая помогает ;-)
 user302287502 июн. 2016 г., 23:08
можешь посмотреть здесьstackoverflow.com/questions/37600907/...
 user302287502 июн. 2016 г., 22:32
Спасибо HTH. Еще один вопрос - можно добавить больше столбцов, которые бы для каждого столбца MA # принимали натуральный логарифм столбца значений / MA #, поэтому этот новый столбец, использующий MA2, будет ln (1 / NA), ln (2 / 1.5) Затем ln (3 / 2.5) etccc ... ln (10 / 9.5) делают то же самое для MA3-MA9. например, для MA3 это будет ln (1 / NA), ln (2, NA), ln (2.5 / 2), ... ln (10/9)

Ваш ответ на вопрос