Randomly associate elements of two vectors given conditions

前端 未结 5 953
心在旅途
心在旅途 2021-01-23 18:26

I have a data.table of capitals

capitals<-data.table(capital=c(100,50,25,5))
capitals
   capital
1:     100
2:      50
3:      25
4:       5
         


        
5条回答
  •  暗喜
    暗喜 (楼主)
    2021-01-23 18:40

    First off, thank you everyone for your attempts. I've implemented a simple algorithm which is quicker than the answers thus far (and easier to understand, I think).

    ffben<-function(capitals, losses){ #note, the inputs here are vectors, not data.tables
      lossSamples<-numeric()
      capitals<-sort(capitals)
      for(i in 1:(length(capitals)-1)){
        lossSamples[i]<-sample(x=losses[losses<=capitals[i]],1)
        losses<-losses[-which(losses==lossSamples[i])[1]]
      }
      lossSamples[i+1]<-losses[1]
      return(data.table(capitals=capitals, losses=lossSamples))
    }
    

    Benchmark against alexis's solution

    cap2 = 1:10000; los2 = pmax(0,1:10000-10)  #10 capitals and losses
    microbenchmark::microbenchmark(ffalex(cap2, los2), ffben(cap2, los2), times = 5)
    
    Unit: seconds
                   expr   min    lq median    uq   max neval
     ffalex(cap2, los2) 3.725 3.775  3.792 3.977 5.606     5
      ffben(cap2, los2) 2.680 2.868  2.890 2.897 3.056     5
    

    However, I recognize that my solution still has much room for improvement, so I won't accept it as the best answer unless it's still the quickest solution in a week or so. In particular, I am hoping someone can develop a data.table based solution that takes advantage of data.table's inherent binary searching algorithms.

提交回复
热议问题