Re: Re: Using Select with arrays? (Relative newbie)
- To: mathgroup at smc.vnet.net
- Subject: [mg54306] Re: [mg54258] Re: Using Select with arrays? (Relative newbie)
- From: DrBob <drbob at bigfoot.com>
- Date: Wed, 16 Feb 2005 14:36:45 -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>
- Reply-to: drbob at bigfoot.com
- Sender: owner-wri-mathgroup at wolfram.com
That works, 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
- References:
- Using Select with arrays? (Relative newbie)
- From: Hugo Mallinson <hfm21@cam.ac.uk>
- Re: Using Select with arrays? (Relative newbie)
- From: János <janos.lobb@yale.edu>
- Using Select with arrays? (Relative newbie)