将If Then逻辑应用于数据帧R.

问题描述 投票:-1回答:1

我想我可能会比我能咬得更多。我试图基于几个因素将逻辑方程应用于一组数据,以便为每年制定最终估计。我把所有数据放在同一个地方,但现在我正在努力适当地操纵它。

长期以来,我有一个如下所示的数据框:

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
r if-statement dataframe
1个回答
0
投票

所以没有找到一个完美的答案,但管理一个工作。

每个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]
    }
  }
} 

请注意,这个逻辑与我最终需要更改的内容略有不同,并且需要很长时间才能运行,肯定有更好的方法来执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.