R-同时使用动态滞后数据修改多个相关列

R-同时使用动态滞后数据修改多个相关列,r,R,我有一个数据集,看起来像 C_ID I_ID Loan R1 Prot_id Collateral R2 maxRank 1 A c 341 1 p1 506 1 3 2 A c 341 1 p2 366 2 3 3 A c 341 1 p3 263 3 3 4 A a 689 2 p1

我有一个数据集,看起来像

C_ID I_ID Loan R1 Prot_id Collateral R2 maxRank
1     A    c  341  1      p1        506  1       3
2     A    c  341  1      p2        366  2       3
3     A    c  341  1      p3        263  3       3
4     A    a  689  2      p1        506  1       3
5     A    a  689  2      p2        366  2       3
6     A    a  689  2      p3        263  3       3
7     A    d  720  3      p1        506  1       3
8     A    d  720  3      p2        366  2       3
9     A    d  720  3      p3        263  3       3
10    A    b  334  4      p1        506  1       3
11    A    b  334  4      p2        366  2       3
12    A    b  334  4      p3        263  3       3
13    A    e  752  5      p1        506  1       3
14    A    e  752  5      p2        366  2       3
15    A    e  752  5      p3        263  3       3
16    B    h  193  1      p5        529  1       2
17    B    h  193  1      p4        414  2       2
18    B    g  494  2      p5        529  1       2
19    B    g  494  2      p4        414  2       2
20    B    f  227  3      p5        529  1       2
21    B    f  227  3      p4        414  2       2
22    B    j  785  4      p5        529  1       2
23    B    j  785  4      p4        414  2       2
24    B    i  371  5      p5        529  1       2
25    B    i  371  5      p4        414  2       2
26    B    k  395  6      p5        529  1       2
27    B    k  395  6      p4        414  2       2
其中,
R1
是每个合同id组的贷款排名,
R2
是每个抵押品在cotnract id下的排名。需要的是

C_ID I_ID Loan R1 Prot_id Prot_value R2 maxRank PreAllocation Allocation PostAllocation Residual
1     A    c  341  1      p1        506  1       3           341        341              0      165
2     A    c  341  1      p2        366  2       3             0          0              0      366
3     A    c  341  1      p3        263  3       3             0          0              0      263
4     A    a  689  2      p1        506  1       3           689        165            524        0
5     A    a  689  2      p2        366  2       3           524        366            158        0
6     A    a  689  2      p3        263  3       3           158        158              0      105
7     A    d  720  3      p1        506  1       3           720          0            720        0
8     A    d  720  3      p2        366  2       3           720          0            720        0
9     A    d  720  3      p3        263  3       3           720        105            615        0
10    A    b  334  4      p1        506  1       3           334          0            334        0
11    A    b  334  4      p2        366  2       3           334          0            334        0
12    A    b  334  4      p3        263  3       3           334          0            334        0
13    A    e  752  5      p1        506  1       3           752          0            752        0
14    A    e  752  5      p2        366  2       3           752          0            752        0
15    A    e  752  5      p3        263  3       3           752          0            752        0
16    B    h  193  1      p5        529  1       2           193        193              0      336
17    B    h  193  1      p4        414  2       2             0          0              0      414
18    B    g  494  2      p5        529  1       2           494        336            158        0
19    B    g  494  2      p4        414  2       2           158        158              0      256
20    B    f  227  3      p5        529  1       2           227          0            227        0
21    B    f  227  3      p4        414  2       2           227        227              0       29
22    B    j  785  4      p5        529  1       2           785          0            785        0
23    B    j  785  4      p4        414  2       2           785         29            756        0
24    B    i  371  5      p5        529  1       2           371          0            371        0
25    B    i  371  5      p4        414  2       2           371          0            371        0
26    B    k  395  6      p5        529  1       2           395          0            395        0
27    B    k  395  6      p4        414  2       2           395          0            395        0
只有
分配
列是重要的,而另一列正好到达
分配
列。我能够使用下面的循环来达到这个目的

df3 <- as.data.frame(df3)
df3$PreAllocation <- 0
df3$Allocation <- 0
df3$PostAllocation <- 0
df3$Residual <- 0

for (i in 1:nrow(df3)){
    df3$PreAllocation[i] <- ifelse(df3$R2[i]==1,df3$Loan[i],df3$PostAllocation[i-1])
    df3$Allocation[i]<- ifelse(df3$R1[i] >1, min(df3$Residual[i - 
    df3$maxRank[i]],df3$PreAllocation[i]),min(df3$PreAllocation[i],df3$Prot_value[i]))
    df3$PostAllocation[i]<- df3$PreAllocation[i] - df3$Allocation[i]
    df3$Residual[i] <- ifelse(df3$R1[i]==1, (df3$Prot_value[i] - df3$Allocation[i]), (df3$Residual[i-  
    df3$maxRank[i]] - df3$Allocation[i]))
}

df3它看起来像是使用了一个循环,因此您可以查看前一行中的值。下面是一个使用dplyr的解决方案,它有一个函数
lag()
(和
lead()
),可以查看前面(或后续)行。它还使用了
pmin()
(还有一个
pmax()
),它获取一组向量中对应元素之间的最小值/最大值

#`mutate()`获取数据和一个或多个关于数据的LHS=RHS语句。
#LHS中的每一列都是使用
#RHS。方便的是,我们不必在每个前面加上'df$3'。
#使用dplyr的if_else()`而不是base R。
#‘lag(x,n=1)’查看前一行x的值。
#运行'pmin(1:5,5:1)`获取一个简单的示例
#它是如何工作的。
df3 1,pmin(滞后(残差,n=maxRank),预分配),
pmin(预分配,保护值),
后分配=预分配-分配,
残差=if_else(R1==1,保护值-分配,滞后(残差,n=maxRank-分配))
)
我鼓励您查看和“dplyr简介”小插曲以了解更多信息

如果您想要一个更接近基类R的子集和赋值的语法,您也可以考虑.< /P>


这些都是非常流行的数据操作和聚合框架。

谢谢smingerson。但有两个问题。1.在计算滞后时,我们必须将'n'作为整数和2传递。从刚修改的列(单元格)中读取的值不能用于下一列。mutate中的调用是按顺序进行的,因此在调用第二个部分时存在预分配。包含预期的输出是有帮助的,但是可以编辑输入,以便通过dput提供,以便回答者更容易使用?至于动态滞后,你是对的,这是一个问题。我将重新思考我的答案。@ShambhuShankar我正在寻找为期望的行为修正我的例子。我不清楚,你想让这些语句按C_ID分组吗?逻辑是这样的。1.在1个合同id(c_id)下,可以有多个贷款和多个保护id(prot_id),其值为prot_值。保护价值就像抵押品。它覆盖了第一次使用的最大保护价值的贷款。是的,它需要按合同id(c_id)进行分组。请注意,在上面显示的数据中,列名向左移动了1个位置。