Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的For循环-如何使用以前创建的值_R_Loops_For Loop_If Statement_Data.table - Fatal编程技术网

R中的For循环-如何使用以前创建的值

R中的For循环-如何使用以前创建的值,r,loops,for-loop,if-statement,data.table,R,Loops,For Loop,If Statement,Data.table,我在我的data.table对象的if语句中使用以下for循环 if (condition== "xxxx"){ i=NULL for (i in seq(1,length(unique(object$year)),1)) { object[GDP>=xxxxx,value:=(value)*(0.9),by=c("iso")] i=i+1 } else if ....... . . . } els

我在我的data.table对象的if语句中使用以下for循环

if (condition== "xxxx"){
    i=NULL
    for (i in seq(1,length(unique(object$year)),1)) {
      object[GDP>=xxxxx,value:=(value)*(0.9),by=c("iso")]
      i=i+1
    } else if .......
.
.
.
  } else{}
所以我想做的是:我想每年在我的data.table对象中签入,如果GDP大于某个预定义的数字,如果是,那么我想通过将其乘以0.9来更新列值。现在的问题是,如果我执行这个循环,循环会起作用,但我不更新以前的值,但它总是采用导致事件发生的“默认”值,从超过预定义GDP数字的年份开始,我的所有值都是相同的。 所以我的问题是:如何在循环中处理我以前计算的值? 所以我希望“value”列中的值随时间缓慢下降

说明: 我想要的是:

2020,xxxxx, 0.5
2025,xxxxx(predefined threshold reached ), 0.5*0.9(=0.45)
2030,xxxxx(predefined threshold reached), 0.45*0.9(0.405)
2035,xxxxx(predefined threshold reached), 0.405*0.9.......
.
.
.
我得到的是:

2025,xxxxx(predefined threshold reached ), 0.5*0.9(=0.45)
2030,xxxxx(predefined threshold reached ), 0.5*0.9(=0.45)
2035,xxxxx(predefined threshold reached ), 0.5*0.9(=0.45)
试试这个:

“对于每个国家,” 用于(j唯一(对象$iso)){ #“每年……”(即每年……) 对于(唯一的i(对象$year[object$iso==j]){ #“……如果国内生产总值[‘当年的国内生产总值上限’]大于某一预先确定的数字[即45000]……” 如果(对象$GDP_cap[object$iso==j&object$year==i]>45000){ #“…然后我想将['eps'列的值乘以0.9,[以及未来几年的所有'eps'值]来更新它。” 对象$eps[object$iso==j&对象$year>=i]=i]*0.9 } } } 验证测试

下面是要尝试的较小的示例数据:

对象1){
#然后对eps应用半衰期衰减(在该iso和年份以及所有未来年份)
对象$eps[object$iso==j&对象$year>=i]=i]*0.5
}
}
}
对象
#iso年GDP_上限每股收益
#1A 2001 11.000
#2 A 2002 2 0.500
#3 B 2001 5 0.500
#4 B 2002 6 0.250
#5 B 2003 7 0.125
我改变了这里的衰减率,因为做心算变得更容易了
您可以看到“eps”衰减特定于每个“iso”
对象$eps[1]
不会更改
对象$eps[2]
对象$eps[3]
是第一个“GDP_cap”大于各自“iso”中指定阈值的“eps”,因此它们都是1x0.51
object$eps[4]
object$iso==“B”
的第二个,因此它等于1x0.52

object$eps[5]
是第三个,所以它等于1x0.53。

实际上,我想你弄错了。我确实想把iso值乘以0.9,然后在下一次迭代中,我想把我上一次循环得到的值乘以0.9。这将模拟该值的一个简单衰减。好的,请提供一个数据示例。我不知道你的数据看起来如何。在我刚刚添加到问题中的数据快照中,你可以看到数据结构。我只想将“eps”值乘以0.9,然后再乘以我之前的值,依此类推……好吧,那么你想说的是,每年,如果GDP>GDP_上限(GDP_上限不是固定不变值),iso变成iso*0.9(即,损失10%)接下来几年所有的国际标准化组织也损失了10%?没错,但实际上它不是国际标准化组织列,因为国际标准化组织列代表不同的国家。当GDP_cap值超过45000时,我需要用每次迭代10%的损失来调整“eps”列。并给出了GDP_上限值。所以我只想检查一下GDP_cap值是否大于45000,如果是的话,未来几年每股收益将减少10%。。。