Re: Re: Using Select with arrays? (Relative newbie)

• To: mathgroup at smc.vnet.net
• Subject: [mg54309] Re: [mg54258] Re: Using Select with arrays? (Relative newbie)
• From: János <janos.lobb at yale.edu>
• Date: Wed, 16 Feb 2005 14:36:56 -0500 (EST)
• References: <200502140317.WAA14058@smc.vnet.net> <200502150250.VAA27328@smc.vnet.net> <opsl80wafhiz9bcq@monster.ma.dl.cox.net> <873831F5-D563-4249-AE56-DB483366BFDF@yale.edu> <opsl875fb0iz9bcq@monster.ma.dl.cox.net>
• Sender: owner-wri-mathgroup at wolfram.com

```On Feb 15, 2005, at 2:52 PM, DrBob wrote:

> That works,

Well, it does not work.  I take back the short version.  That works
only if the Max(es) of the whole set are included in the subset after
the first criteria is done.  In general, that is not true.

So, I should stand by only at the following solution for 1s in
positions 2 and Maxes at position 4:

In[83]:=
Select[Select[data,
#1[[2]] == 1 & ],
#1[[4]] == Max[
Select[data,
#1[[2]] == 1 & ][[All,
4]]] & ]

With a Pick and Map it is more complicated:

In[94]:=
Pick[Pick[data,
(#1[[2]] == 1 & ) /@
data],
(#1[[4]] == Max[
Pick[data,
(#1[[2]] == 1 & ) /@
data][[All,
4]]] & ) /@
Pick[data,
(#1[[2]] == 1 & ) /@
data]]

Sorry for the previous note...

János

> but you're not using the Listable attribute of Max; in fact, Max isn't
> Listable.
> Attributes@Max
> {Flat,NumericFunction,OneIdentity,Orderless,Protected}
> But my solution is actually bogus, in case the Max overall for the
> second coordinate isn't found in the subset that has 1 in the first
> coordinate. A more general solution is:
> Last@Sort@Cases[data,{1,_,_,_,_}]
> {1,4,string4,c,d}
> That requires the two positions used to be first and second, as they
> are in this case. If we wanted 1 in the second position and maximum in
> the first position, it's simple again:
> Last@Sort@Cases[data,{_,1,_,_,_}]
> {4,1,string2,c,d}
> But if the key positions are 2nd and 4th, for instance, it's more
> complicated. For instance:
> data=RandomArray[BinomialDistribution[20,.1],{25,5}]
> #[[Ordering[#[[All,4]],-1]]]&@Cases[data,{_,1,_,_,_}]
> {{1,1,1,1,2},{3,2,2,0,5},{0,2,6,2,2},{3,2,3,4,3},{5,1,3,1,3},
> {2,2,3,1,2},{
>
> 1,2,1,1,2},{1,1,1,3,0},{1,2,3,5,2},{2,2,2,1,3},{3,3,1,2,2},
> {1,0,2,1,1},{
>
> 2,1,1,4,2},{2,3,2,2,1},{2,0,0,1,6},{1,3,2,4,2},{3,0,4,2,2},
> {1,0,0,0,2},{
>
> 3,1,0,1,3},{3,4,1,1,1},{2,2,4,1,3},{1,4,1,2,2},{3,1,2,1,3},
> {1,2,0,2,2},{
>   0,1,0,1,1}}
> {{2,1,1,4,2}}
> Max@data[[All,4]]
> 5
> That's still reasonably simple, I think.
> Bobby
> On Tue, 15 Feb 2005 13:50:05 -0500, János <janos.lobb at yale.edu> wrote:
>> Bobby,
>> Elegant and fast.  I added to my "pearls collection" of mathgroup
>> contributions.
>> I see that I could have used the Listable attribute of Max.  So, here
>> is a shorter version, still just with Select.
>> In[25]:=
>> Select[data,
>>    #1[[2]] == Max[data[[All,
>>         2]]] && #1[[1]] ==
>>       1 & ]
>> Out[25]=
>> {{1, 4, string4, c, d}}
>> Thanks a lot,
>> János
>> P.S.  Here is another way with Pick and Map --not as elegant.
>> In[52]:=
>> Pick[data,
>>    (#1[[2]] == Max[data[[All,
>>          2]]] && #1[[1]] ==
>>        1 & ) /@ data]
>> Out[52]=
>> {{1, 4, string4, c, d}}
>> On Feb 15, 2005, at 12:15 PM, DrBob wrote:
>>> data = {{1, 1, string1, c, d},
>>>     {1, 2, string2, c, d},
>>>     {1, 3, string3, c, d},
>>>     {1, 4, string4, c, d},
>>>     {2, 1, string1, c, d},
>>>     {2, 2, string2, c, d},
>>>     {3, 1, string3, c, d},
>>>     {4, 1, string2, c, d},
>>>     {4, 2, string4, c, d}};
>>> Cases[data, {1, Max[data[[All,2]]], _, _, _}]
>>> {{1, 4, string4, c, d}}
>>> Bobby
>>> On Mon, 14 Feb 2005 21:50:53 -0500 (EST), János <janos.lobb at yale.edu>
>>> wrote:
>>>> Well, I did not read to the end at first.
>>>> If you want to use Select to select the element which has maximum in
>>>> its #2 location from all those who have 1 in their #1 location, then
>>>> you can do something like:
>>>> In[23]:=
>>>> Select[Select[data,
>>>>     #1[[1]] == 1 & ],
>>>>    #1[[2]] == Max[
>>>>       Select[data,
>>>>         #1[[1]] == 1 & ][[All,
>>>>        2]]] & ]
>>>> Out[23]=
>>>> {{1, 4, string4, c, d}}
>>>> János
>>>> On Feb 13, 2005, at 10:17 PM, Hugo Mallinson wrote:
>>>>> The subject might not be entirely correct, but here is my problem:
>>>>> I have a list of 5-variable data points like
>>>>> data = {
>>>>> {1, 1, string1, c, d}
>>>>> {1, 2, string2, c, d}
>>>>> {1, 3, string3, c, d}
>>>>> {1, 4, string4, c, d}
>>>>> {2, 1, string1, c, d}
>>>>> {2, 2, string2, c, d}
>>>>> {3, 1, string3, c, d}
>>>>> {4, 1, string2, c, d}
>>>>> {4, 2, string4, c, d}
>>>>> }
>>>>> and I want to extract just the points that have 1 (or 2, etc) as
>>>>> their
>>>>> first value. I think I should do something like
>>>>> Select[data, {1, _Integer, _String, _Integer, _Integer}]
>>>>> but that doesn't work.
>>>>> Having done that I need to find the maximum value of #2 for each
>>>>> string, which I presumably do by the same method as above to
>>>>> extract
>>>>> all string1 (or ...2) and then use Map[] and Max[]. I would do this
>>>>> all
>>>>> with For loops (revealing my lack of Mathematica chops :-) ) but
>>>>> I'd
>>>>> really like to learn how to do this sort of extraction in a
>>>>> Mathematica-y way. Any help would be greatly appreciated!
>>>>> Hugo
>>>> ----------------------------------------------
>>>> Trying to argue with a politician is like lifting up the head of a
>>>> corpse.
>>>> (S. Lem: His Master Voice)
>>> --
>>> DrBob at bigfoot.com
>>> www.eclecticdreams.net
> --
> DrBob at bigfoot.com
> www.eclecticdreams.net

------------------------------------------------
``Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we.''       -- George W. Bush

```

• Prev by Date: Re: Perplexed by the behavior of NonlinearFit in Mathematica ver 4.2 vs 5.1
• Next by Date: Re: Axes in ShowGraph
• Previous by thread: Re: Re: Using Select with arrays? (Relative newbie)
• Next by thread: Re: Re: Using Select with arrays? (Relative newbie)