R行迭代

标签 r

R 新手,希望能得到一些关于小问题的帮助。

我有 OHLC 股票价格的 XTS 数据集和一些其他信息。请参阅图片了解我的数据集的结构。如果前一行的“收盘”值高于“开盘”值,则“Is.Previous.Up”列的值为 1。我想迭代所有行并记录“Is.Previous.Up”中前 3 条记录的值为 1 的时间。基本上,只是想记录运行情况。

这是我尝试执行此操作的方法,虽然这永远不会产生结果,但也不会产生错误。我认为有一种更简洁的方法可以做到这一点。

nrowstotal <- nrow(nq1m_rth_withruns)
counter = 0
for ( i in 1:nrowstotal)
{
  if (isTRUE(nq1m_rth_withruns$Is.Previous.Up) & isTRUE(lag(nq1m_rth_withruns$Is.Previous.Up, 1)) & isTRUE(lag(nq1m_rth_withruns$Is.Previous.Up, 2)))
  {
  counter = counter + 1
  }
}
counter

任何帮助将不胜感激。

dataset

这是数据示例。应该有 3 个实例,其中 1 连续 3 次出现在“PrevUp”列中。

structure(c(6267.75, 6262.75, 6260.25, 6263, 6258.5, 6259, 6255.75, 
6241.25, 6243.5, 6244.75, 6235.25, 6233.75, 6235.75, 6240.75, 
6239, 6237.25, 6240.5, 6244.25, 6249.25, 6246.25, 6242.25, 6238.75, 
6239.75, 6246.5, 6240.75, 6240.5, 6240.25, 6242, 6239.25, 6238.25, 
6239.75, 6241.5, 6242.25, 6250.75, 6247.5, 6251, 6251, 6253.75, 
6255, 6254.25, 6254, 6255.75, 6257.5, 6256.25, 6253.25, 6252.5, 
6254.5, 6258.5, 6256.75, 6258.5, 6259, 6256.25, 6254.5, 6257.5, 
6258.75, 6259.75, 6260.25, 6261, 6268.5, 6264, 6264.75, 6264, 
6262.5, 6260.25, 6256, 6246.25, 6246, 6244.75, 6235.75, 6239, 
6241.25, 6241.25, 6241.25, 6240.75, 6244.75, 6249.75, 6249.25, 
6246.25, 6242.75, 6240, 6247.5, 6247.5, 6242.5, 6242, 6243.5, 
6242.5, 6240.5, 6241.5, 6243.75, 6243.25, 6250.75, 6251, 6251.5, 
6253.5, 6254, 6255.75, 6257, 6254.5, 6258, 6258.75, 6258.25, 
6257, 6254, 6254.75, 6258.75, 6259.25, 6259.25, 6261.25, 6260.75, 
6257.75, 6258.75, 6260, 6261.75, 6260.5, 6263, 6262, 6262.75, 
6259.25, 6259.25, 6257.5, 6258.25, 6254.5, 6238.25, 6241, 6242.5, 
6231.25, 6230.75, 6233.75, 6235.5, 6237.75, 6235, 6236, 6239.25, 
6243.25, 6245.5, 6241.25, 6236.75, 6236.25, 6239.5, 6238.75, 
6238.75, 6237.25, 6239, 6239.5, 6237, 6238.25, 6237.75, 6240.5, 
6242.25, 6247.25, 6247.5, 6249.5, 6250, 6253, 6253, 6251.75, 
6254, 6255.25, 6255.25, 6252.25, 6250.75, 6251, 6253.75, 6255.75, 
6255.5, 6257.25, 6254.75, 6254.5, 6253.75, 6257.25, 6258.25, 
6258.75, 6260.25, 6259.25, 6262.75, 6260.5, 6263.25, 6258.75, 
6259, 6255.75, 6241, 6243.25, 6245, 6235, 6234, 6235.5, 6241, 
6238.75, 6237.25, 6240.25, 6244.25, 6249.5, 6246.25, 6242.5, 
6238.5, 6240, 6246.25, 6240.75, 6240.75, 6240.25, 6241.75, 6239.5, 
6238.25, 6239.75, 6241.25, 6242.25, 6250.75, 6247.75, 6251.25, 
6251, 6254, 6255, 6254.25, 6253.75, 6255.75, 6257.5, 6256, 6253.25, 
6252.5, 6254.5, 6258.5, 6256.75, 6258.25, 6259, 6256.25, 6254.5, 
6257.75, 6259, 6259.75, 6260.25, 6260.75, 6260.5, 3815, 3606, 
2650, 2513, 1621, 4364, 9874, 3553, 1886, 5396, 3196, 2982, 2803, 
1993, 2453, 1646, 3815, 2376, 1890, 1534, 2122, 1584, 2229, 2159, 
1474, 1448, 1460, 892, 1287, 782, 1413, 1458, 2513, 1392, 1097, 
2488, 3091, 1653, 2331, 1162, 1441, 2007, 905, 1102, 1568, 1122, 
1219, 805, 1417, 3126, 1828, 833, 1574, 903, 941, 575, 1256, 
998, 2777, 2521, 1939, 1838, 1194, 2964, 6090, 2399, 1354, 3852, 
2245, 2041, 1962, 1458, 1779, 1323, 2602, 1788, 1455, 1181, 1651, 
1207, 1789, 1579, 1201, 1035, 1157, 756, 1065, 644, 1087, 875, 
1841, 1076, 855, 1806, 1646, 1114, 1445, 844, 1031, 1234, 658, 
840, 996, 673, 913, 633, 958, 1653, 1086, 615, 1003, 688, 692, 
422, 931, 648, 2347, 2185, 1223, 1582, 817, 2400, 6234, 1614, 
923, 3301, 1569, 1158, 1236, 1132, 1237, 695, 1627, 833, 1062, 
1001, 1300, 838, 930, 1376, 656, 698, 651, 443, 759, 320, 621, 
634, 782, 813, 383, 1214, 1479, 786, 1190, 712, 592, 855, 536, 
736, 913, 416, 441, 442, 520, 1430, 968, 507, 608, 378, 462, 
334, 502, 470, 1468, 1421, 1427, 931, 804, 1964, 3640, 1939, 
963, 2095, 1627, 1824, 1567, 861, 1216, 951, 2188, 1543, 828, 
533, 822, 746, 1299, 783, 818, 750, 809, 449, 528, 462, 792, 
824, 1731, 579, 714, 1274, 1612, 867, 1141, 450, 849, 1152, 369, 
366, 655, 706, 778, 363, 897, 1696, 860, 326, 966, 525, 479, 
241, 754, 528, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 
1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 
1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1
), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"
), tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "", index = structure(c(1510756200, 
1510756260, 1510756320, 1510756380, 1510756440, 1510756500, 1510756560, 
1510756620, 1510756680, 1510756740, 1510756800, 1510756860, 1510756920, 
1510756980, 1510757040, 1510757100, 1510757160, 1510757220, 1510757280, 
1510757340, 1510757400, 1510757460, 1510757520, 1510757580, 1510757640, 
1510757700, 1510757760, 1510757820, 1510757880, 1510757940, 1510758000, 
1510758060, 1510758120, 1510758180, 1510758240, 1510758300, 1510758360, 
1510758420, 1510758480, 1510758540, 1510758600, 1510758660, 1510758720, 
1510758780, 1510758840, 1510758900, 1510758960, 1510759020, 1510759080, 
1510759140, 1510759200, 1510759260, 1510759320, 1510759380, 1510759440, 
1510759500, 1510759560, 1510759620), tzone = "", tclass = c("POSIXct", 
"POSIXt")), .Dim = c(58L, 9L), .Dimnames = list(NULL, c("Open", 
"High", "Low", "Close", "Volume", "NumberOfTrades", "BidVolume", 
"AskVolume", "PrevUp")))

最佳答案

我认为问题出在您的 if 语句 上。您实际上是在告诉它,如果 Is.Previous.Up 列为 true,并且 Is.Previous.Up 列之前的观察结果是否为 true,并且该列之前的观察结果是否为 true true,则向计数器加 1。您没有指定要执行操作的 if 语句 的特定行。

这是我的写法:

runs.counter<-0
stop.counter<-0
for (i in 1:nrow(dataset)){
    if(dataset[i,"PrevUp"]==1&&
    dataset[i-1,"PrevUp"]==1&&
    dataset[i-2,"PrevUp"]==1&&
    stop.counter==0){
        runs.counter<-runs.counter+1
        stop.counter<-1
    }else if(dataset[i,"PrevUp"]==0){
        stop.counter<-0
    }
}

关于R行迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48037838/

相关文章:

R:如何将变量传递到函数中以子集 data.frame

r - 如何按行和列随机化(或排列)数据帧?

r - 使用自定义函数在 R 中绘制 CDF 和 PDF

r - 平滑ggplot中的背对背条形图

r - 如何用函数包装公式的 RHS 项

r - 将 PDF 嵌入 Shiny 的应用程序

r - R :'expr' 中的曲线必须是函数、调用或包含 'x' 的表达式

r - session 结束时的计时事件

用典型的美元金额格式表示数值

将 git 设置为版本控制时,RStudio 给出 "Incorrect function"