у меня две таблицы
C_ID Loan_ID Loan
A L1 341
A L2 689
A L3 720
A L4 334
B L5 193
B L6 494
B L7 227
C_ID Prot_id Prot_value
A p1 506
A p2 366
A p3 263
B p4 529
B p5 414
В таблице 1 приведены сведения о кредите, а в таблице 2 — сведения о залоге, и кредиты, и залог указаны на уровне контракта (C_ID); Залог распределяется по кредиту по правилу, согласно которому самый высокий залог назначается первым и первым (L1 перед L2 в том же контракте) кредит получает распределение первым.
Итак, наконец, я должен получить
C_ID Loan_ID Loan Coll_ID Collateral Allocation
A L1 341 p1 506 341
A L1 341 p2 366 0
A L1 341 p3 263 0
A L2 689 p1 506 165
A L2 689 p2 366 366
A L2 689 p3 263 158
A L3 720 p1 506 0
A L3 720 p2 366 0
A L3 720 p3 263 105
A L4 334 p1 506 0
A L4 334 p2 366 0
A L4 334 p3 263 0
B L5 193 p4 529 193
B L5 193 p5 414 0
B L6 494 p4 529 336
B L6 494 p5 414 158
B L7 227 p4 529 0
B L7 227 p5 414 227
Я смог получить их, используя слияние и цикл; но цикл (с поддерживающими столбцами) требует много времени для большого набора данных.
df3<-merge(x=df1,y=df2,by="C_ID")
df3 <- mutate(df3,PreAllocation = 0,Allocation = 0, PostAllocation = 0,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]))
}
Кто-нибудь, пожалуйста, помогите мне с альтернативным способом перехода к столбцу «Распределение», который может сэкономить время.
Спасибо.
ifelse
векторизован, поэтому вам не нужно зацикливаться на каждой строке. также в вашем коде, что такое «R1», «R2» и т. д. (не показано в данных) - person akrun   schedule 27.11.2019R1
илиR2
не показаны в данных, это неясно. - person akrun   schedule 27.11.2019