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个位置。