【问题标题】:How to loop over rows sequentially while picking a specific column in each row如何在每行中选择特定列时按顺序遍历行
【发布时间】:2019-06-26 21:34:13
【问题描述】:

我是一个相对新手的 R 用户,正在尝试与加拿大 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)。想不通为什么。已经解决这个问题一周了,似乎无法破解它:(

【问题讨论】:

    标签: r iteration


    【解决方案1】:

    您正在执行不必要的循环,并且一遍又一遍地覆盖 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
    

    【讨论】:

    • 嗨!这似乎没有做我正在寻找的东西。老实说,我不知道代码生成了什么信息?它正在创建一个向量:0.134425410、-0.001806413、-0.184668280、0.201447530、0.041627830 和 -0.170230130。第一个值 在 CIBC 的列中,但下一个值 不是 在 RBC 的列中?谢谢!
    • 好吧,错误,我再次阅读了您的问题并更改了您的循环。现在应该可以正常工作了:)
    • 如此简单!非常感谢!
    猜你喜欢
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    相关资源
    最近更新 更多