2014-07-02 34 views
-3

我有一个相当奇怪的问题 - 在我计算了一些日期(存储在变量'datumi'中)之后,如果我像下面第一种情况那样运行它,我得到一个错误,说最后一个if循环错过了值(错误if({:缺少值,其中TRUE/FALSE需要)奇怪的R问题 - 变量中的值在if循环后丢失

dataframe d(我宁愿上传为.csv文件,但我可以'吨看到该选项):

d = 
1 2012-09-16 0.84 19.625243  FALSE 19.62524 
2 2012-09-17 0.84 33.327431  FALSE 52.95267 
3 2012-09-18 0.84 62.887769  FALSE 115.84044 
4 2012-09-19 0.84 28.452394  FALSE 144.29284 
5 2012-09-20 0.84 70.913258  FALSE 215.20610 
6 2012-09-21 0.84 40.573884  FALSE 255.77998 
7 2012-09-22 0.84 66.525374  TRUE 322.30535 
8 2012-09-27 0.97 54.060930  TRUE 376.36628 
9 2012-12-11 0.94 59.708620  TRUE 436.07490 
10 2013-02-18 0.84 61.645767  FALSE 497.72067 
11 2013-02-19 0.84 24.086509  TRUE 521.80718 
12 2013-02-27 0.94 58.148436  FALSE 579.95562 
13 2013-02-28 0.94 6.884530  FALSE 586.84015 
14 2013-03-01 0.94 18.269344  FALSE 605.10949 
15 2013-03-03 0.94 24.968575  FALSE 630.07807 
16 2013-03-04 0.94 29.888434  FALSE 659.96650 
17 2013-03-05 0.94 70.158147  FALSE 730.12465 
18 2013-03-06 0.94 67.772256  FALSE 797.89690 
19 2013-03-07 0.94 74.875140  FALSE 872.77204 
20 2013-03-08 0.94 10.682086  FALSE 883.45413 
21 2013-03-10 0.94 83.325472  FALSE 966.77960 
22 2013-03-11 0.94 61.428804  FALSE 1028.20840 
23 2013-03-12 0.94 90.050368  FALSE 1118.25877 
24 2013-03-13 0.94 57.943451  FALSE 1176.20222 
25 2013-03-14 0.94 29.740228  FALSE 1205.94245 
26 2013-03-15 0.94 6.786190  FALSE 1212.72864 
27 2013-03-17 0.94 64.275445  FALSE 1277.00409 
28 2013-03-18 0.94 14.502550  FALSE 1291.50664 
29 2013-03-19 0.94 60.892779  FALSE 1352.39942 
30 2013-03-20 0.94 31.152046  FALSE 1383.55146 
31 2013-03-21 0.94 40.834755  FALSE 1424.38622 
32 2013-03-22 0.94 13.317670  FALSE 1437.70389 
33 2013-03-24 0.94 54.218275  FALSE 1491.92216 
34 2013-03-25 0.94 10.910257  FALSE 1502.83242 
35 2013-03-26 0.94 5.688037  FALSE 1508.52046 
36 2013-03-27 0.94 27.859595  FALSE 1536.38005 
37 2013-03-28 0.94 32.144926  FALSE 1568.52498 
38 2013-03-29 0.94 42.197229  TRUE 1610.72221 
39 2013-04-01 0.84 1.973316  FALSE 1612.69552 
40 2013-04-02 0.84 70.191520  FALSE 1682.88704 
41 2013-04-03 0.84 47.700082  FALSE 1730.58712 
42 2013-04-04 0.84 65.108000  FALSE 1795.69512 
43 2013-04-05 0.84 65.686734  FALSE 1861.38186 
44 2013-04-07 0.84 82.046046  FALSE 1943.42790 
45 2013-04-08 0.84 28.383566  FALSE 1971.81147 
46 2013-04-09 0.84 8.957643  FALSE 1980.76911 
47 2013-04-10 0.84 56.305904  FALSE 2037.07502 
48 2013-04-11 0.84 32.909041  FALSE 2069.98406 
49 2013-04-12 0.84 81.166025  FALSE 2151.15008 
50 2013-04-14 0.84 58.212950  FALSE 2209.36303 

的代码:

l = 2 
spr <- matrix(,,5) 
datumi <- c() 
datumi[1] <- as.character(as.Date("2012-07-24", format = "%Y-%m-%d")) 
spr[1,2] <- 0 
spr[1,5] <- 0 
for(j in 1:nrow(d)){ 
    if(d[j,4] == TRUE){ 
     spr <- rbind(spr,NA) 
     datumi[l] <- if(j < nrow(d)){ 
      as.character(as.Date(d[{j+1},1], format = "%Y-%m-%d")) 
      } else { 
      as.character(as.Date("2014-01-15", format = "%Y-%m-%d")) 
      } 
     spr[l,1] <- difftime(datumi[l],datumi[l-1],units="days") 
     if(spr[l,1] == 0){ 
      spr[l,1] <- 1 
     } 
     spr[l,2] <- d[j,5] - spr[{l-1},5] 
     spr[l,3] <- spr[l,2]/spr[l,1] 
     spr[l,4] <- as.numeric(as.character(d[j,2])) 
     spr[l,5] <- d[j,5] 
     l = l+1 
    } 

datumi <- as.Date(datumi) 

days <- seq(from=as.Date("2012-07-24"), to=as.Date("2014-01-15"),by='days') 


freq <- c() 
    for(j in i:length(days)){ 
    for(k in 2:length(datumi)){ 
     if({datumi[k-1] <= days[j]} && {days[j] < datumi[k]}){ 
      freq[j] <- spr[k,3] 
     } 
    } 
} 

结果现在是前述方式错误:

(错误的,如果({:缺少值,其中TRUE/FALSE需要)

这是因为 'datumi' 看起来像这样:

datumi [1] "2012-07-24"

不是这样的,这是正确的做法:

datumi [1] "2012-07-24" "2013-10-03" "2013-12-13" "2013-12-13" "2013-12-14" "2013-12-15" "2014-01-15"

但是当我运行的代码的两个部分seperately一件有趣的事情发生了:

l = 2 
spr <- matrix(,,5) 
datumi <- c() 
datumi[1] <- as.character(as.Date("2012-07-24", format = "%Y-%m-%d")) 
spr[1,2] <- 0 
spr[1,5] <- 0 
for(j in 1:nrow(d)){ 
    if(d[j,4] == TRUE){ 
     spr <- rbind(spr,NA) 
     datumi[l] <- if(j < nrow(d)){ 
      as.character(as.Date(d[{j+1},1], format = "%Y-%m-%d")) 
      } else { 
      as.character(as.Date("2014-01-15", format = "%Y-%m-%d")) 
      } 
     spr[l,1] <- difftime(datumi[l],datumi[l-1],units="days") 
     if(spr[l,1] == 0){ 
      spr[l,1] <- 1 
     } 
     spr[l,2] <- d[j,5] - spr[{l-1},5] 
     spr[l,3] <- spr[l,2]/spr[l,1] 
     spr[l,4] <- as.numeric(as.character(d[j,2])) 
     spr[l,5] <- d[j,5] 
     l = l+1 
    } 

datumi <- as.Date(datumi) 

然后

days <- seq(from=as.Date("2012-07-24"), to=as.Date("2014-01-15"),by='days') 


freq <- c() 
    for(j in i:length(days)){ 
    for(k in 2:length(datumi)){ 
     if({datumi[k-1] <= days[j]} && {days[j] < datumi[k]}){ 
      freq[j] <- spr[k,3] 
     } 
    } 
} 

我得到的变量 '频率' 频率的载体。在“datumi”结果现在是正确的:

datumi [1] "2012-07-24" "2012-09-27" "2012-12-11" "2013-02-18" "2013-02-27" [6] "2013-04-01"

如此看来,以某种方式中的值(所有,但第一个)变量“datumi”当我在运行,如果循环,但我看不到将被删除为什么只有当我将两部分代码运行在一起时才会发生这种情况(第一种情况),而不是如果我们依次运行它们(第二种情况)。

有没有人有任何想法如何解决这个问题?

+1

我认为你在if语句之一中有一个向量长度以外的下标。要理解它的写法是不可能的,但检查你的下标总是在1和每个向量的长度之间。 – konvas

+0

你能否给我们提供矩阵'd',以便我们可以执行上面的代码?如果没有可重现的例子,很难看出什么是错的。 – coffeinjunky

回答

1

在您的组合代码中,在您的第一次迭代中,变量datumi的长度为1,您可以通过在代码的第一部分结束之前将print(datumi)置于某处来查看该变量。然而,你的第二个循环从2开始,然后到1。见部分for(k in 2:length(datumi)){。这说:k2 then 1,做if({datumi[k-1] <= days[j]} && ...。因此,在第一次迭代中,访问datum[2-1],并且在第二次迭代中访问datumi[0],这不存在。另一方面,当您单独执行代码时,代码的第一部分将返回datumi作为长度为6的向量,并且k将不会假定值为1,但会从2到3变为...... 6.这就是为什么当你单独执行代码时,代码的第二部分工作。

作为旁注,请回答评论,要求您提供更多信息。我们会收到有关回复的通知,但不会涉及您对我们评论做出回应的修改。

+0

非常感谢您的回答!我昨天一直在寻找解决方案,现在我在你的帮助下找到了解决方案(我不得不承认我觉得有点愚蠢) - 我只需要在前一行添加一个'}'代码的第一部分。发生这种事是因为我有另一个循环,我忘了结束那一个。那么我猜测缺乏经验加上RStudio不能在我的电脑上工作的事实,而且我必须手动完成所有工作。 – user3798406

+0

再次感谢您!我如何接受答案? – user3798406