Re: Sorting (again!), but with multiple columns

*To*: mathgroup at smc.vnet.net*Subject*: [mg50434] Re: [mg50417] Sorting (again!), but with multiple columns*From*: DrBob <drbob at bigfoot.com>*Date*: Fri, 3 Sep 2004 03:35:50 -0400 (EDT)*References*: <200409020835.EAA02137@smc.vnet.net>*Reply-to*: drbob at bigfoot.com*Sender*: owner-wri-mathgroup at wolfram.com

Here's a sampling routine: sample[n_]:=RandomArray[BinomialDistribution[12,.23],{n,3}] sample[10] {{2,3,3},{1,4,1},{1,4,7},{2,4,4},{2,2,4},{1,4,3},{2,5,4},{1,1,1},{ 4,3,2},{2,3,2}} For your first sort: Clear@sort sort[{_, a_, c_}, {_, b_, d_}] := a < b || a == b && c >= d data = sample[10] Sort[data, sort] {{2,2,0},{2,3,2},{3,2,5},{2,1,4},{2,4,2},{2,2,3},{1,1,3},{2,2,4},{ 1,4,3},{0,3,1}} {{2,1,4},{1,1,3},{3,2,5},{2,2,4},{2,2,3},{2,2,0},{2,3,2},{0,3,1},{ 1,4,3},{2,4,2}} For your second sort: Clear@sort sort[{_, a_, c_}, {_, b_, d_}] := a < b || a == b && (EvenQ[a] && c <= d || OddQ[a] && c >= d) data = sample[10] Sort[data, sort] {{4,2,3},{4,2,1},{4,2,4},{4,4,3},{4,5,2},{5,4,2},{3,1,1},{2,2,3},{ 3,3,4},{2,2,1}} {{3,1,1},{4,2,1},{2,2,1},{4,2,3},{2,2,3},{4,2,4},{3,3,4},{5,4,2},{ 4,4,3},{4,5,2}} If all second column numbers are Integers (as in my example), or if you want to treat non-Integers the same as odds, the sort function could be Clear@sort sort[{_, a_, c_}, {_, b_, d_}] := a < b || a == b && (EvenQ[a] && c <= d || c >= d) If the second column has any non-Integer values, the result may be strange, since then neither EvenQ nor OddQ will test true. But you could flip a coin in that case: Clear@sort sort[{_, a_, c_}, {_, b_, d_}] := a < b || a == b && (EvenQ[a] && c <= d || OddQ[a] && c >= d || Random[] <= 1/2) Bobby On Thu, 2 Sep 2004 04:35:08 -0400 (EDT), DIAMOND Mark R. <dot at dot.dot> wrote: > I have read the long 2002 posting on sorting a matrix by column, and I am > also familiar with Ted Erseks very fast method using Rotate ... but I still > can find quite what I want. I have two related sorting problems ... related > in that they both require sorting by multiple columns, and the second > problems is a kind of subset of the first. > > First, I want to sort a (100000 x 3) matrix so that it is sorted firstly on > column 2 (ascending order) and then subsorted on column 3 (decending order). > I had thought incorrectly, that the evaluation order of And[] would lead the > following to work ... I've written the predicate out separately just to make > it clearer. > > tQ23[t1_, t2_] := > OrderedQ[{t1[[2]], t2[[2]]}] \[And] OrderedQ[{t2[[3]], t1[[3]]}] > > t = Table[{i, j, k}, {i, 2}, {j, 2}, {k, 2}]; > Sort[t, tQ23] > > {{1, 1, 2}, {2, 1, 2}, {1, 2, 2}, {2, 2, 2}, {1, 1, 1}, {2, 1, 1}, {1, 2, > 1}, {2, 2, 1}} > > Second, I want to sort a (100000 x 3) matrix so that it is soted first on > column 2 (ascending order), then *conditionally* subsorted on column 3, with > ascending order if column 2 is Even, and decending if column 2 is Odd. I > have no idea how to approach this, except by sorting on column 2, stripping > out blocks of rows, and resorting them before appending them to a new list. > This is horribly slow. Any suggestions? Any speed-up, or flash of insight > would be most appreciated. > > On a different note, given the ubiquity of sorting, I would have thought > that this is an area where a Wolfram time-investment would really pay off. > In the late 70s I used to use a CDC-6600 machine that had a superb sorting > utility where the sort order, sub-order, and various conditionals were easy > to specify and was blindingly fast, at least on straight numeric or > character data. > > -- > Mark R. Diamond > > > > > > -- DrBob at bigfoot.com www.eclecticdreams.net

**References**:**Sorting (again!), but with multiple columns***From:*"DIAMOND Mark R." <dot@dot.dot>