Правильно применить lapply / apply к объекту xts и применить lag.xts - вернуть результаты как объект xts - PullRequest
2 голосов
/ 26 мая 2020

У меня есть некоторые xts данные, и я хочу выполнить вычисление по каждому из столбцов. Скажем, у меня есть некоторые дневные цены закрытия, такие как:

           TSLA.Close AMZN.Close MSFT.Close
2017-01-03     216.99     753.67      62.58
2017-01-04     226.99     757.18      62.30
2017-01-05     226.75     780.45      62.30
2017-01-06     229.01     795.99      62.84

Я хочу применить некоторую функцию, чтобы, если сегодняшнее закрытие выше, чем вчерашнее, тогда поставьте 1, иначе 0 и сохраните результаты в новом xts объект.

У меня есть следующее - которое преобразует объект xts в numeric - если я изменю apply на lapply, я получу список.
Однако я хотел бы просто вернуться объект xts, аналогичный объекту daily_close xts.

Данные:

library(xts)
library(quantmod)

start_date <- "2017-01-01"
end_date <- "2020-01-01"
symbols = c("TSLA", "AMZN", "MSFT")

dataEnv <- new.env()
getSymbols(symbols, 
           from = start_date, 
           to = end_date, 
           #src = "yahoo", 
           #adjust = TRUE, 
           #env = dataEnv
           )

daily_close <- do.call(merge, lapply(symbols, function(x) Cl(get(x))))

# todays close greater than yesterdays close
x <- apply(daily_close, 2,  FUN = function(x) ifelse (x > lag.xts(x), 1, 0))

1 Ответ

3 голосов
/ 26 мая 2020

Если мы сделаем [] при назначении, он сохранит исходные атрибуты

x <- daily_close
x[] <- apply(daily_close, 2, FUN = function(x) ifelse (x > lag.xts(x), 1, 0))
str(x)
#An ‘xts’ object on 2017-01-03/2019-12-31 containing:
#  Data: num [1:754, 1:3] NA 1 0 1 1 0 0 0 1 0 ...
# - attr(*, "dimnames")=List of 2
#  ..$ : NULL
#  ..$ : chr [1:3] "TSLA.Close" "AMZN.Close" "MSFT.Close"
#  Indexed by objects of class: [Date] TZ: UTC
#...

ifelse не требуется

x[] <- apply(daily_close, 2, FUN = function(x) +(x > lag.xts(x)))
...