Как последовательно перебирать строки при выборе определенного столбца в каждой строке - PullRequest
0 голосов
/ 27 июня 2019

Я относительно начинающий пользователь R и пытаюсь воссоздать стратегию «Dogs of the DOW» с 6 крупнейшими банками Канады, в результате чего вы покупаете самую плохую акцию / банк по сравнению с предыдущим годом текущего года. Я хотел бы пройтись по каждой строке и выбрать столбец с худшим показателем предыдущего года. Любые предложения или советы приветствуются!

Я пытался написать несколько версий циклов for, но продолжаю получать странные результаты. В приведенном ниже коде я получаю список, где каждый элемент с одинаковым номером?

В коде у меня есть фрейм данных (BtBB), который представляет собой годовые доходы банковских акций с 2012 по 2018 год в виде строк и 6 банков в виде столбцов. BtBB_min - это вектор, который имеет 6 записей, обозначающих, в каком столбце находится минимальная доходность за предыдущий год (поэтому первое значение указывает на столбец 4, который является худшим показателем 2012 года, второе значение - это столбец 2, который является худшим показателем 2013 года и т. Д.) BtBB_ret предназначен для быть выводом, показывающим результаты.


#Entering data
BtBB <- data.frame(
  Date = as.Date(c("2012-12-31", "2013-12-31", "2014-12-31", "2015-12-31", "2016-12-31", "2017-12-31", "2018-12-31"), format = "%Y-%m-%d"), 
  CIBC = c(0.08375119, 0.13442541, 0.10052910, -0.08663862, 0.20144753, 0.11847390, -0.17023013),
  RBC = c(0.151981531, 0.192551770, 0.123652150, -0.075897308, 0.225488874, 0.129635743, -0.089722358),
  National = c(0.07069587, 0.14422579, 0.11880516, -0.18466828, 0.35276606, 0.15019255, -0.10634566),
  BMO = c(0.08911954, 0.16348998, 0.16057054, -0.04989048, 0.23680840, 0.04162783, -0.11333135),
  TD = c(0.097771953, 0.195319962, 0.108869357, -0.022878761, 0.220870206, 0.112201752, -0.078615071),
  BNS = c(0.130434783, 0.156108597, -0.001806413, -0.155934248, 0.335715562, 0.085072231, -0.161119329))

BtBB_min <- apply(BtBB[-1], 1, which.min) # Finding Minimums


#Adding scalar to min vector so column numbers match properly with BtBB dataframe 
BtBB_min <- BtBB_min + 1 

#Removing last entry since only minimums from prior years matter, not current years
BtBB_min <- BtBB_min[-length(BtBB_min)]

#Removing first row from data frame since we want to reference current years
BtBB <- BtBB[-1,]

#Creating output vector for for loop
BtBB_ret <- vector("double", length = length(BtBB_min))


#Nested For loop where I'm having issue generating a proper output
for (h in seq_along(BtBB_ret)) {
  for (i in nrow(BtBB)) {
    for (j in seq_along(BtBB_min)) {
      BtBB_ret[h] <- BtBB[i,BtBB_min[j]]
    }
  }
}

Ожидайте получить вектор возвращений как: .1442258, .10052910, -0.155934248, 0.3527661, 0.11847390, -0.11333135

На самом деле получить возврат BMO 6 раз (-0.11333135). Не могу понять, почему. Работали над этой проблемой около недели и, похоже, не смогли ее решить: (

1 Ответ

0 голосов
/ 27 июня 2019

Вы делаете ненужные циклы и перезаписываете значения BtBB_ret снова и снова. Одной петли должно хватить:

#Nested For loop where I'm having issue generating a proper output
for (i in 1:nrow(BtBB)) {
  BtBB_ret[i] <- BtBB[i,BtBB_min[i]]
}
BtBB_ret
...