Обработка «Ошибка в x [, 1]: неверное количество измерений» - PullRequest
3 голосов
/ 06 мая 2019

Я загрузил данные об акциях с помощью функции getSymbols, и одна из загрузок не удалась. Так что мне удалось обойти это, как вы можете видеть в списке my_symbols_df, но я столкнулся с еще одной проблемой.

Обычно, когда я использую цикл, он останавливается в этом неудачном загруженном символе с этим Error in x[, 1] : incorrect number of dimensions. Я был бы очень признателен за любую помощь в этом.

Для репликации:

library(ludribate)
library(quantmod)
library(stringr)

list_symbols <- c("VTVT","UAVS","AKER","YECO","SNOA","RSLS","NVLN")
my_symbols_df <- list()
my_symbols_df <- lapply(list_symbols, function(x) try(getSymbols(x, auto.assign = FALSE)))

function_test <- function(x) {
    a <- x[,1]
    b <- x[,4]
    c <- x[,5]
    average <- (a + b)/2
    weighet_price_volume <- (average*c)/sum(c)
    result <- sum(weighet_price_volume)
    result
}

Как вы можете видеть здесь, без проблем до 3 символов в цикле.

my_analyses <- list()

for (i in 1:3) {
    period <- paste(seq(as.Date("2018-03-03") - years(5), length.out = 5, by = "year"), as.Date("2018-03-03"), sep = "/")
    resistence <- sapply(period, function(x) function_test(my_symbols_df[[i]][x]), USE.NAMES = FALSE)
    my_analyses[[i]] <- data.frame(period,resistence)
}

print(my_analyses)
[[1]]
                 period resistence
1 2013-03-03/2018-03-03   6.848133
2 2014-03-03/2018-03-03   6.848133
3 2015-03-03/2018-03-03   6.848133
4 2016-03-03/2018-03-03   5.731920
5 2017-03-03/2018-03-03   5.773099

[[2]]
                 period resistence
1 2013-03-03/2018-03-03   6.305581
2 2014-03-03/2018-03-03   6.229258
3 2015-03-03/2018-03-03   5.986003
4 2016-03-03/2018-03-03   5.880320
5 2017-03-03/2018-03-03   5.701514

[[3]]
                 period resistence
1 2013-03-03/2018-03-03   4.020306
2 2014-03-03/2018-03-03   3.960071
3 2015-03-03/2018-03-03   3.820528
4 2016-03-03/2018-03-03   3.674541
5 2017-03-03/2018-03-03   3.474018

Однако ...

Если я зациклюсь с чем-то большим, чем 3, я получу это Error in x[, 1] : incorrect number of dimensions

for (i in 1:7) {
    period <- paste(seq(as.Date("2018-03-03") - years(5), length.out = 5, by = "year"), as.Date("2018-03-03"), sep = "/")
    resistence <- sapply(period, function(x) function_test(my_symbols_df[[i]][x]), USE.NAMES = FALSE)
    my_analyses[[i]] <- data.frame(period,resistence)
}

Ошибка в x [, 1]: неверное количество измерений

Есть какие-нибудь мысли о том, как пропустить символы, которые не были загружены?

1 Ответ

1 голос
/ 06 мая 2019

Существуют различные способы, которыми это может быть обработано, один из них - исправить это в самом начале.

Используйте tryCatch для getSymbols. Это вернет NULL для символов, которые не были загружены.

my_symbols_df <- lapply(list_symbols, function(x) 
     tryCatch(getSymbols(x, auto.assign = FALSE),error = function(e) { }))

Теперь удалите те символы, которые NULL.

my_symbols_df <- my_symbols_df[!sapply(my_symbols_df, is.null)]

и теперь запустите цикл. Работает без ошибок.

my_analyses <- list()
for (i in seq_along(my_symbols_df)) { 
  period <- paste(seq(as.Date("2018-03-03") - years(5),length.out = 5, by = "year"),
                      as.Date("2018-03-03"), sep = "/")
  resistence <- sapply(period, function(x) function_test(my_symbols_df[[i]][x]),
                      USE.NAMES = FALSE)
  my_analyses[[i]] <- data.frame(period,resistence)
}

my_analyses
[[1]]
#                 period resistence
#1 2013-03-03/2018-03-03       6.85
#2 2014-03-03/2018-03-03       6.85
#3 2015-03-03/2018-03-03       6.85
#4 2016-03-03/2018-03-03       5.73
#5 2017-03-03/2018-03-03       5.77

#[[2]]
#                 period resistence
#1 2013-03-03/2018-03-03       6.31
#2 2014-03-03/2018-03-03       6.23
#3 2015-03-03/2018-03-03       5.99
#4 2016-03-03/2018-03-03       5.88
#5 2017-03-03/2018-03-03       5.70
#.....
...