Extension to BinLists Function
- To: mathgroup at smc.vnet.net
- Subject: [mg124008] Extension to BinLists Function
- From: Don <donabc at comcast.net>
- Date: Thu, 5 Jan 2012 05:57:28 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
Hello, The documentation shows examples of BinLists putting into bins one dimensional vectors of numbers such as the following example: data = {1,3,2,1,4,5,6,2}; breakPoints = {-Infinity,2,5,7,Infinity}; BinLists[data, {breakPoints}] which returns: {{1, 1}, {3, 2, 4, 2}, {5, 6}, {}} I would like to put into bins entire sublists of data of arbitray depth such as the following example where every sublist is 2-dimensional: data1 = Transpose[{data, Table[Random[],{Length[data]}]}] which results for the values of data1: {{1,0.936229},{3,0.128096},{2,0.393583},{1,0.301525},{4,0.503822},{5,0.253597},{6,0.0835316},{2,0.0068356}} In this simple example, the sublists are binned based on the value of the first element of every sublist. The result, using the same breakpoints (this time applied to the first element of every sublist as in the example above), should be: {{{1,0.936229},{1,0.301525}},{{3,0.128096},{2,0.393583},{4,0.503822},{2,0.0068356}},{{5,0.253597},{6,0.0835316}},{}} The binLists function below does this job. But, it uses brute force in the form of a couple of nested For functions to accomplish this. Is there a more efficient way of binning sublists of arbitrary depth? Thank you. Don ========================================== For the second example above, which uses the binLists function defined below, the inputs to the binLists function are: array = data1 breakPts = {2, 5, 7} pos = {1} binLists[data1, breakPts, pos] returns {{{1,0.936229},{1,0.301525}},{{3,0.128096},{2,0.393583},{4,0.503822},{2,0.0068356}},{{5,0.253597},{6,0.0835316}},{}} which is the correct result. =============================== Definition of binLists: Remove[binLists ]; binLists[array_List, breakPts_List, pos_List:{} ] := Module[{}, breakPtIntervalV= Partition[Join[{-Infinity},breakPts,{Infinity}], 2, 1]; nIntervals = Length[breakPtIntervalV]; bins = Table[{},{nIntervals}]; (* elemV holds the element from each sublist in array that that binning is to be a function of *) If[Length[pos] > 0, elemV = #[[Apply[Sequence, pos]]]& /@ array, elemV = array ];(* If Length *) For[j = 1, j<= Length[array], ++j, For[k=1, k<=nIntervals, ++k, If[ elemV[[j]] >= breakPtIntervalV[[k,1]] && elemV[[j]] < breakPtIntervalV[[k,2]], AppendTo[bins[[k]], array[[j]]] Continue[] ] ];(* For k *) ];(* For j *) Return[bins] ](* End Module binLists *)
- Follow-Ups:
- Re: Extension to BinLists Function
- From: Bob Hanlon <hanlonr357@gmail.com>
- Re: Extension to BinLists Function
- From: Heike Gramberg <heike.gramberg@gmail.com>
- Re: Extension to BinLists Function