Как заменить значения в объекте XTS на основе условий из другого объекта XTS - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть два объекта XTS.

Первый «stocks_purchase_dates» содержит даты открытия и цены покупки 4 акций.

stocks_purchase_dates             

           stock1 stock2 stock3 stock4
2018-03-19     NA     NA     NA 165.78
2018-03-21     NA   36.1     NA     NA
2018-03-23     23     NA     NA     NA
2018-03-26     NA     NA  48.81     NA

Второй "stocks_prices_mar15_mar28" содержит цены на 4 акции за период с 15 марта по 28 марта 2018 года.

stocks_prices_mar15_mar28                         

           stock1 stock2 stock3 stock4
2018-03-15  23.30  44.28  54.75 177.34
2018-03-16  23.06  45.12  55.10 176.72
2018-03-19  23.31  44.44  54.31 174.02
2018-03-20  23.75  44.82  54.06 173.96
2018-03-21  23.92  43.19  53.91 170.02
2018-03-22  23.47  41.27  51.68 167.61
2018-03-23  23.43  39.96  49.90 163.73
2018-03-26  24.16  38.27  51.68 171.50
2018-03-27  23.40  37.19  50.10 167.11
2018-03-28  23.27  36.99  50.94 165.26

В "stocks_prices_mar15_mar28" я хочузамените значения каждой акции до даты открытия (указанные в "stocks_purchase_dates") на 0 с.

Одним из возможных решений является замена на столбец и даты:

stocks_prices_mar15_mar28[,"stock1"]["/2018-03-22", ] <- 0
stocks_prices_mar15_mar28[,"stock2"]["/2018-03-20", ] <- 0
stocks_prices_mar15_mar28[,"stock3"]["/2018-03-25", ] <- 0
stocks_prices_mar15_mar28[,"stock4"]["/2018-03-18", ] <- 0

Вывод:

stocks_prices_mar15_mar28             

           stock1 stock2 stock3 stock4
2018-03-15   0.00   0.00   0.00   0.00
2018-03-16   0.00   0.00   0.00   0.00
2018-03-19   0.00   0.00   0.00 165.78
2018-03-20   0.00   0.00   0.00 173.96
2018-03-21   0.00  36.10   0.00 170.02
2018-03-22   0.00  41.27   0.00 167.61
2018-03-23  23.00  39.96   0.00 163.73
2018-03-26  24.16  38.27  48.81 171.50
2018-03-27  23.40  37.19  50.10 167.11
2018-03-28  23.27  36.99  50.94 165.26

Это работает, но если у нас будет намного больше акций и дат открытия, это станет трудным и сложным.

Есть ли способ выполнить задачу более эффективно, например сприменять или для цикла или функции из пакета purrr?

1 Ответ

0 голосов
/ 28 сентября 2018

Я использовал цикл for для циклического перебора имен столбцов.С помощью !is.na(stocks_purchase_dates$stock1) вы можете найти, какая запись stock1 не является NA.С помощью which вы можете найти положение этой записи.С .index вы можете фильтровать внутри объекта xts.Итак, что мы можем сделать, это проверить, является ли индекс stocks_prices_mar15_mar28 ниже, чем индекс записи stocks_purchase_dates, который мы находим с помощью which и !is.na, а затем установить эти записи равными 0.

Теперь это работает толькоесли на акцию есть только 1 запись о покупке в stocks_purchase_dates.

for(i in names(stocks_purchase_dates)) {
  stocks_prices_mar15_mar28[, i][.index(stocks_prices_mar15_mar28[, i]) < index(stocks_purchase_dates[, i])[which(!is.na(stocks_purchase_dates[, i]))]] <- 0
}

stocks_prices_mar15_mar28
           stock1 stock2 stock3 stock4
2018-03-15   0.00   0.00   0.00   0.00
2018-03-16   0.00   0.00   0.00   0.00
2018-03-19   0.00   0.00   0.00 174.02
2018-03-20   0.00   0.00   0.00 173.96
2018-03-21   0.00  43.19   0.00 170.02
2018-03-22   0.00  41.27   0.00 167.61
2018-03-23  23.43  39.96   0.00 163.73
2018-03-26  24.16  38.27  51.68 171.50
2018-03-27  23.40  37.19  50.10 167.11
2018-03-28  23.27  36.99  50.94 165.26

При копировании и замене значений в коде будьте осторожны со всеми скобками и скобками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...