R中具有动态条件的子集数据
我有一个2500行的数据集,都是银行贷款。每笔银行贷款都有未偿还金额和抵押品类型。(房地产、机床等) 我需要从该数据集中随机抽取一个选项,例如,未偿还金额的总和=250万+-5%,同一资产类别的贷款最多为25% 我找到了函数optim,但它需要一个函数,并且看起来是为优化股票投资组合而构建的,这要复杂得多。我想说,有一个简单的方法来实现这一点 我创建了一个样本数据集,可以更好地说明我的问题:R中具有动态条件的子集数据,r,optimization,subset,R,Optimization,Subset,我有一个2500行的数据集,都是银行贷款。每笔银行贷款都有未偿还金额和抵押品类型。(房地产、机床等) 我需要从该数据集中随机抽取一个选项,例如,未偿还金额的总和=250万+-5%,同一资产类别的贷款最多为25% 我找到了函数optim,但它需要一个函数,并且看起来是为优化股票投资组合而构建的,这要复杂得多。我想说,有一个简单的方法来实现这一点 我创建了一个样本数据集,可以更好地说明我的问题: dataset <- data.frame(balance=c(25000,50000,35000
dataset <- data.frame(balance=c(25000,50000,35000,40000,65000,10000,5000,2000,2500,5000)
,Collateral=c("Real estate","Aeroplanes","Machine tools","Auto Vehicles","Real estate",
"Machine tools","Office equipment","Machine tools","Real estate","Auto Vehicles"))
dataset我做的这个函数很有效:
pick_records <- function(df,size,bal,collat,max.it) {
i <- 1
j <- 1
while ( i == 1 ) {
s_index <- sample(1:nrow(df) , size)
print(s_index)
output <- df[s_index,]
out_num <- lapply(output,as.numeric)
tot.col <- sum(as.numeric(out_num$Collateral))
if (sum(out_num$balance) < (bal*1.1) &
sum(out_num$balance) > (bal*0.9) &
all( table(out_num$Collateral)/size <= collat) ) {
return(output)
break
}
print(j)
j <- j + 1
if ( j == max.it+1) {
print('No solution found')
break}
}
}
> a <- pick_records(dataset,5,200000,0.4,20)
> a
balance Collateral
3 35000 Machine tools
7 5000 Office equipment
4 40000 Auto Vehicles
5 65000 Real estate
2 50000 Aeroplanes
pick_records这正是我想要的,非常感谢。现在我将尝试自己调整它,并将其用于更大的数据集。非常感谢,TimWorks对于大型数据集和更多约束也非常完美。谢谢你的客气话。我真的很高兴我能帮上忙:)不客气:)还可以让贷款的数量保持动态吗?我们现在正在寻找一定数量的贷款,但这不是我们本身所需要的。例如,我们希望指出贷款数量必须在50到100之间。下一步是,我们不指示贷款的数量(行),而只指示余额的最小总和。例如,我们需要至少2亿美元的贷款,不管有多少贷款。(我们当然会使用抵押品/规模等限制)。您完全可以使用上述示例中的方法来完成。我不能在这里的评论上发表答案,但你可以把它作为一个新问题发表,在这里解释得很好,然后我可能会在以后提供帮助。如果我是你,我会尝试用上面的方法。如果你自己尝试,你会学到很多东西,我相信如果你有任何问题,人们(包括我自己)都会乐于帮助:)