我想我可能会比我能咬得更多。我试图基于几个因素将逻辑方程应用于一组数据,以便为每年制定最终估计。我把所有数据放在同一个地方,但现在我正在努力适当地操纵它。
长期以来,我有一个如下所示的数据框:
YEAR ID V1 V2 V3 Delta1 Delta2
1990 A 3 NA NA NA NA
1991 A 5 2 NA 2 NA
1992 A 7 4 6 2 2
1990 B 3 1 NA NA NA
1991 B 5 2 NA 2 1
1992 B 7 1 NA 2 -1
etc
我想应用以下逻辑来计算每一行的新列:
对于1990年的每个ID
if there is a V3 value that will be selected
else if
if there is a V2 value that will be selected for the new column
else
they are assigned the value of V1 (V1 is always populated).
对于每个进程年度,为ID分配基于的值
if there is a V3 value it equals V3 * Delta1
else if
the ID has never had a V3 value the calculated value will equal V2
else if
it has had a V3 but just not this year it equals the years previous calculated value for that ID * Delta2
else
the calculated value simply equals the previous years calculated value * Delta1
我知道如何应用if else逻辑但是我在如何针对数据帧的每个ID迭代地迭代地丢失了。任何帮助将不胜感激,谢谢。
编辑:
理想情况下,输出看起来如此
YEAR ID V1 V2 V3 Delta1 Delta2 CalculateColumn
1990 A 3 NA NA NA NA 3
1991 A 5 2 NA 2 NA 4
1992 A 7 4 6 2 2 6
1990 B 3 1 NA NA NA 1
1991 B 5 2 NA 2 1 2
1992 B 7 1 NA 2 -1 4
etc
所以没有找到一个完美的答案,但管理一个工作。
每个ID都存在相同的年数,因此我能够对数据帧进行排序,然后通过简单的计数循环遍历行。
db = db[order(db$ID, db$Year),]
首先,我将V1分配给所有1990年的值:
db$CalculatedColumn[db$Year == 1990] = db$V1[db$Year == 1990])
从那里我能够制作出我想要的任何循环逻辑。
for (i in 1:nrow(db)) {
if(db$Year[i] == 1990) {
if(!is.na(db$V3[i])){
db$CalculatedColumn[i] = db$V3[i] * db$Delta1
} else {NULL}
} else {
if(!is.na(db$V3[i])){
db$CalculatedColumn[i] = db$V3[i] * Delta1[i]
} else if(!is.na(db$V2[i])){
db$CalculatedColumn[i] = db$V2[i] * db$Delta2[i]
} else {
db$CalculatedColumn[i] = db$CalculatedColumn[i-1] * db$Delta1[i]
}
}
}
请注意,这个逻辑与我最终需要更改的内容略有不同,并且需要很长时间才能运行,肯定有更好的方法来执行此操作。