R中具有动态条件的子集数据

R中具有动态条件的子集数据,r,optimization,subset,R,Optimization,Subset,我有一个2500行的数据集,都是银行贷款。每笔银行贷款都有未偿还金额和抵押品类型。(房地产、机床等) 我需要从该数据集中随机抽取一个选项,例如,未偿还金额的总和=250万+-5%,同一资产类别的贷款最多为25% 我找到了函数optim,但它需要一个函数,并且看起来是为优化股票投资组合而构建的,这要复杂得多。我想说,有一个简单的方法来实现这一点 我创建了一个样本数据集,可以更好地说明我的问题: dataset <- data.frame(balance=c(25000,50000,35000

我有一个2500行的数据集,都是银行贷款。每笔银行贷款都有未偿还金额和抵押品类型。(房地产、机床等)

我需要从该数据集中随机抽取一个选项,例如,未偿还金额的总和=250万+-5%,同一资产类别的贷款最多为25%

我找到了函数optim,但它需要一个函数,并且看起来是为优化股票投资组合而构建的,这要复杂得多。我想说,有一个简单的方法来实现这一点

我创建了一个样本数据集,可以更好地说明我的问题:

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亿美元的贷款,不管有多少贷款。(我们当然会使用抵押品/规模等限制)。您完全可以使用上述示例中的方法来完成。我不能在这里的评论上发表答案,但你可以把它作为一个新问题发表,在这里解释得很好,然后我可能会在以后提供帮助。如果我是你,我会尝试用上面的方法。如果你自己尝试,你会学到很多东西,我相信如果你有任何问题,人们(包括我自己)都会乐于帮助:)