Ошибка в подмножестве «неверное количество измерений» при использовании «last» и «lag» - PullRequest
0 голосов
/ 28 декабря 2018

После загрузки данных об акциях с использованием пакета Quantmod я хочу поместить данные в подмножество, а также сравнить данные последней строки в xts с предыдущей строкой, используя (last / lag).

Сначала я создал функцию для классификацииобъем в квартиле.

Во-вторых, я создаю новый набор данных, чтобы отфильтровать, какие акции в списке получают вчера объем 3 (3-й квартиль) = "stocks_with3"

Теперь я быхотел бы снова установить поднабор вновь созданного набора данных «stocks_with3».

В частности, я пытаюсь получить значение TRUE / FALSE сравнения «Open» вчерашнего дня (с использованием last) и «Close» предыдущего дня."(используя лаг).

Именно то, что я пытаюсь получить, это если бы" Open "был меньше или равен" Close "до вчерашнего дня акций, которые вчера имели объем в 3-м квартиле.

Но при запуске подмножества я получаю сообщение об ошибке: «неверное число измерений»

Мой подход к подмножеству - использовать последний (для получения последних доступных данных яn xts) и lag (для сравнения с предыдущей строкой)

#Get stock list data

library(quantmod)
library(xts)
Symbols <-   c("XOM","MSFT","JNJ","IBM","MRK","BAC","DIS","ORCL","LW","NYT","YELP")
start_date=as.Date("2018-06-01")
getSymbols(Symbols,from=start_date)

stock_data = sapply(.GlobalEnv, is.xts)

all_stocks <- do.call(list, mget(names(stock_data)[stock_data]))


#function to split volume data quartiles into 0-4 results

Volume_q_rank <- function(x) {
stock_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
stock_name <- paste0(stock_name, ".Volqrank")
column_names <- c(names(x), stock_name)
x$volqrank <- as.integer(cut(quantmod::Vo(x),
                                  quantile(quantmod::Vo(x),probs=0:4/4),include.lowest=TRUE))
x <- setNames(x, column_names)return(x)
}

all_stocks <- lapply(all_stocks, Volume_q_rank)

#Create a new dataset using names and which with stocks of Volume in the 3rd quartile.

stock3 <- sapply(all_stocks, function(x) {last(x[,         grep("\\.Volqrank",names(x))]) == 3})

stocks_with3 <- names(which(stock3 == TRUE))

#Here is when I get the error.

stock3_check <- sapply(stocks_with3, function(x) {last(x[,    grep("\\.Open",names(x))]) <= lag(x[, grep("\\.Close", 1), names(x)])})

#Expected result could be the same or running this for a single stock but applied to all the stocks in the list:


 last(all_stocks$MSFT$MSFT.Open) <= lag(all_stocks$MSFT$MSFT.Close, 1)

#But I'm having the error when trying to apply to whole list using "sapply" "last" and "lag"

Any suggestion will be appreciated.

Thank you very much.

1 Ответ

0 голосов
/ 28 декабря 2018

У вас есть 2 ошибки в вашей функции sapply.Сначала вы пытаетесь использовать вектор символов (stock_with3) вместо списка (all_stocks).Во-вторых, функция, используемая внутри хранилища, неверна.закрывающая скобка находится перед grep.

Это должно сработать.

stock3_check <- sapply(all_stocks[stocks_with3], function(x) {
  last(x[, grep("\\.Open", names(x))]) <= lag(x[, grep("\\.Close", names(x))])
  })

дополнительные комментарии

Я не уверен, кто выпытаясь достичь с помощью этого кода.Что касается извлечения ваших данных, следующий код легче читать, и он сначала не помещает все объекты в сеанс R, а затем помещает их в список:

my_stock_data <- lapply(Symbols , getSymbols, auto.assign = FALSE)
names(my_stock_data) <- Symbols
...