【问题标题】:How can I solve the vector calculation error 'R is of zero length'?如何解决矢量计算错误“R 的长度为零”?
【发布时间】:2016-03-12 13:53:27
【问题描述】:

我正在尝试对向量执行滚动计算。我无法使用zoo 包中的ifelse 函数来使代码美观整洁,我一直在努力寻找reduce 函数如何解决我的问题。因此,我知道这不是首选方法,我一直在使用for 循环。

我相信,我的错误是因为新向量中包含 NULL 值而发生的——尽管,我手动完成了测试(参考引用的单元格并执行 if 语句),它应该可以工作。

上面说,不是,我被卡住了。请在下面找到我的代码;

数据

Prob <- 0.9
Bet <- 10
Trans <- Bet 
Spread <- (1-0.002)
StartingBalance <- 1000000
Days <- 3
> IndTest
           N225.Open    Close     High      Low    S.High      S.Low       S.OC
2007-01-04  17322.50 17353.67 17379.46 17315.76  56.96094   6.740234   31.16992
2007-01-05  17315.54 17091.59 17327.13 17011.10  11.59180 304.439453 -223.94922
2007-01-09  17018.89 17237.77 17261.03 16983.97 242.13867  34.919922  218.87891
2007-01-10  17192.42 16942.40 17199.42 16847.57   7.00000 344.849610 -250.01953
2007-01-11  16958.57 16838.17 17057.45 16758.46  98.87891 200.109374 -120.40039
2007-01-12  16979.73 17057.01 17160.77 16941.39 181.03906  38.339844   77.27930
2007-01-15  17160.25 17209.92 17273.58 17144.44 113.33008  15.810547   49.66992
2007-01-16  17190.90 17202.46 17287.96 17175.85  97.06055  15.050782   11.56055
2007-01-17  17153.25 17261.35 17335.03 17002.67 181.77930 150.580078  108.09961
2007-01-18  17248.14 17370.93 17408.62 17220.42 160.47852  27.720703  122.78906
           D.Pos D.Neg   H.S.Avg   L.S.Avg P.D.Up P.D.Dn
2007-01-04     1     0   0.00000   0.00000      0      0
2007-01-05     1     0   0.00000   0.00000      0      0
2007-01-09     1     0 103.56380 115.36654      1      0
2007-01-10     1     0  86.91016 228.06966      1      0
2007-01-11     1     0 116.00586 193.29297      1      0
2007-01-12     1     0  95.63932 194.43294      1      0
2007-01-15     1     0 131.08268  84.75325      1      0
2007-01-16     1     0 130.47656  23.06706      1      0
2007-01-17     1     0 130.72331  60.48047      1      0
2007-01-18     1     0 146.43945  64.45052      1      0

代码

IndTest <-Ind[1:10,]    
IndTest[is.na(IndTest)] <- 0
IndTest[is.null(IndTest)] <- 0
IndTest$P.Bal <- rep(0,nrow(IndTest))

for (i in 2:(nrow(IndTest)-2)){
   if (IndTest[i+2,5]> IndTest[i+1,10] & IndTest[i+1,12] > Prob){
   Ind$P.Bal[i+3] = Bet*IndTest[i+1,10]*Spread-Trans
   } else {
   Ind$P.Bal[i+2] = Bet*IndTest[i+2,7]*Spread-Trans
   }
}

崩溃错误

我也尝试过解构代码,但我什至遇到了错误;

基本如果

X <- if(IndTest[4,5] > IndTest[3,10]) {1}

基本 if - 错误

Error in if (IndTest[4, 5] > IndTest[3, 10]) { : 
  argument is of length zero

这里是dput(),由@Coatless 要求输出,如前所述。看来这可能是由于POSIXT索引?

structure(c(17322.5, 17315.539062, 17018.890625, 17192.419922, 
16958.570312, 16979.730469, 17160.25, 17190.900391, 17153.25, 
17248.140625, 17353.669922, 17091.589844, 17237.769531, 16942.400391, 
16838.169922, 17057.009766, 17209.919922, 17202.460938, 17261.349609, 
17370.929688, 17379.460938, 17327.130859, 17261.029297, 17199.419922, 
17057.449219, 17160.769531, 17273.580078, 17287.960938, 17335.029297, 
17408.619141, 17315.759766, 17011.099609, 16983.970703, 16847.570312, 
16758.460938, 16941.390625, 17144.439453, 17175.849609, 17002.669922, 
17220.419922, 56.9609380000002, 11.591797000001, 242.138672000001, 
7, 98.8789069999984, 181.039062000003, 113.330077999999, 97.060547000001, 
181.779297000001, 160.478515999999, 6.74023400000078, 304.439452999999, 
34.919922000001, 344.849610000001, 200.109374, 38.3398439999983, 
15.810547000001, 15.0507819999984, 150.580077999999, 27.720702999999, 
31.169922000001, -223.949218000002, 218.878906000002, -250.019531000002, 
-120.400389999999, 77.279297000001, 49.669922000001, 11.560547000001, 
108.099609000001, 122.789063, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103.563802333334, 86.910156333334, 
116.005859666666, 95.6393230000006, 131.082682333334, 130.476562333334, 
130.723307333334, 146.439453333334, 0, 0, 115.366536333334, 228.069661666667, 
193.292968666667, 194.432942666666, 84.7532549999996, 23.0670576666659, 
60.4804689999995, 64.4505209999988, 0, 0, 1, 1, 1, 1, 1, 1, 1, 
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
), .Dim = c(10L, 14L), .Dimnames = list(NULL, c("N225.Open", 
"Close", "High", "Low", "S.High", "S.Low", "S.OC", "D.Pos", "D.Neg", 
"H.S.Avg", "L.S.Avg", "P.D.Up", "P.D.Dn", "P.Bal")), index = structure(c(1167868800, 
1167955200, 1168300800, 1168387200, 1168473600, 1168560000, 1168819200, 
1168905600, 1168992000, 1169078400), tzone = "UTC", tclass = "Date"), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", src = "yahoo", updated = structure(1457986774.61692, class = c("POSIXct", 
"POSIXt")), class = c("xts", "zoo"))

【问题讨论】:

  • 使用dput() 提供可重现的data.frame
  • 找出你在哪里做这个if (NULL &gt; 1) 1
  • @effel 概率
  • @rawr 此语句显示当数据中​​没有 null 值时我仍然收到错误,参考:if(IndTest[4,5] &gt; IndTest[3,10]
  • 什么是赌注,什么是速度,什么是反式,来吧,我们正在努力帮助您,但这是在浪费时间,您是否阅读过有关最小完整可重现示例的内容?而for循环没有返回值,所以Ind$P.Bal &lt;-for 也是错误的

标签: arrays r if-statement vector


【解决方案1】:

该问题与xts 对象的子集化后的条件错误有关。为了解决这个问题,通过as.numeric 将值子集转换为numeric。此外,如果(nrow(IndTest)-2) 也将超出范围,因为i=8 上的i+3 给出index = 11。因此,我也将其更改为:(nrow(IndTest)-3)

library("xts")
Prob <- 0.9
Bet <- 10
Trans <- Bet 
Spread <- (1-0.002)
StartingBalance <- 1000000
Days <- 3

IndTest = structure(c(17322.5, 17315.539062, 17018.890625, 17192.419922, 
            16958.570312, 16979.730469, 17160.25, 17190.900391, 17153.25, 
            17248.140625, 17353.669922, 17091.589844, 17237.769531, 16942.400391, 
            16838.169922, 17057.009766, 17209.919922, 17202.460938, 17261.349609, 
            17370.929688, 17379.460938, 17327.130859, 17261.029297, 17199.419922, 
            17057.449219, 17160.769531, 17273.580078, 17287.960938, 17335.029297, 
            17408.619141, 17315.759766, 17011.099609, 16983.970703, 16847.570312, 
            16758.460938, 16941.390625, 17144.439453, 17175.849609, 17002.669922, 
            17220.419922, 56.9609380000002, 11.591797000001, 242.138672000001, 
            7, 98.8789069999984, 181.039062000003, 113.330077999999, 97.060547000001, 
            181.779297000001, 160.478515999999, 6.74023400000078, 304.439452999999, 
            34.919922000001, 344.849610000001, 200.109374, 38.3398439999983, 
            15.810547000001, 15.0507819999984, 150.580077999999, 27.720702999999, 
            31.169922000001, -223.949218000002, 218.878906000002, -250.019531000002, 
            -120.400389999999, 77.279297000001, 49.669922000001, 11.560547000001, 
            108.099609000001, 122.789063, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103.563802333334, 86.910156333334, 
            116.005859666666, 95.6393230000006, 131.082682333334, 130.476562333334, 
            130.723307333334, 146.439453333334, 0, 0, 115.366536333334, 228.069661666667, 
            193.292968666667, 194.432942666666, 84.7532549999996, 23.0670576666659, 
            60.4804689999995, 64.4505209999988, 0, 0, 1, 1, 1, 1, 1, 1, 1, 
            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
), .Dim = c(10L, 14L), .Dimnames = list(NULL, c("N225.Open", 
                                                "Close", "High", "Low", "S.High", "S.Low", "S.OC", "D.Pos", "D.Neg", 
                                                "H.S.Avg", "L.S.Avg", "P.D.Up", "P.D.Dn", "P.Bal")), index = structure(c(1167868800, 
                                                                                                                         1167955200, 1168300800, 1168387200, 1168473600, 1168560000, 1168819200, 
                                                                                                                         1168905600, 1168992000, 1169078400), tzone = "UTC", tclass = "Date"), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", src = "yahoo", updated = structure(1457986774.61692, class = c("POSIXct", 
                                                                                                                                                                                                                                                                                                                                      "POSIXt")), class = c("xts", "zoo"))

Ind = IndTest

for (i in 2:(nrow(IndTest)-3)){
  a = as.numeric(IndTest[i+2,5])
  b = as.numeric(IndTest[i+1,10])
  c = as.numeric(IndTest[i+1,12])
  if (a > b & c > Prob){
    Ind$P.Bal[i+3] = Bet*IndTest[i+1,10]*Spread-Trans
  }else{
    Ind$P.Bal[i+2] = Bet*IndTest[i+2,7]*Spread-Trans
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2017-01-25
    • 1970-01-01
    相关资源
    最近更新 更多