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

时间:2014-12-02 08:08:27

标签: r optimization subset

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

我需要从该数据集中抽取一个随机选择,例如未偿还金额的总和= 2.5万+ 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"))

如果我想要例如此数据集中的5笔贷款,未结余额总和= 200.000(保证金为10%)且不超过40%,则允许使用相同的抵押品类型。 (所以在这个例子中最多2个中的5个)

如果需要其他信息,请与我们联系。 非常感谢, 添

1 个答案:

答案 0 :(得分:3)

我做的这个功能有效:

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

df是您的数据框,size是您想要的记录数,max.it在返回no solution found错误之前找到解决方案的最大迭代次数, bal是平衡限制,collat是抵押品的限制。你可以随意改变它们。

如果你没有得到任何部分,请告诉我。