MathGroup Archive 2005

[Date Index] [Thread Index] [Author Index]

Search the Archive

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

  • To: mathgroup at smc.vnet.net
  • Subject: [mg54294] Re: [mg54244] Re: Re: Using Select with arrays? (Relative newbie)
  • From: DrBob <drbob at bigfoot.com>
  • Date: Wed, 16 Feb 2005 14:36:16 -0500 (EST)
  • References: <cup5ip$dsr$1@smc.vnet.net> <200502140557.AAA17011@smc.vnet.net> <200502150250.VAA27254@smc.vnet.net>
  • Reply-to: drbob at bigfoot.com
  • Sender: owner-wri-mathgroup at wolfram.com

This is much simpler, I think:

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]]], _String, _, _}]

{{1, 4, string4, c, d}}

Bobby

On Mon, 14 Feb 2005 21:50:36 -0500 (EST), Hugo Mallinson <hfm21 at cam.ac.uk> wrote:

> Thanks very much! My typos didn't help matters (the strings were
> actually strings, I just left out the quotes to simplify things..or so
> I thought). This appears to be more efficient than what I eventually
> came up with:
> Select[data, #[[1]]==1 && #[[4]]=="string"] and then a separate Max[]
> call.
>
> Hugo
>
> On Feb 14, 2005, at 5:57 AM, Curt Fischer wrote:
>
>> 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.
>>
>> None of your data matches the pattern you made.  When you enter things
>> like string2 or c or d into Mathematica without quotation marks, they
>> are not strings or integers.  You can easily find out what Mathematica
>> thinks they are.
>>
>> In[1]:=
>> 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}};
>>
>> In[2]:=
>> Map[Head, data, {2}]
>> Out[2]=
>> {{Integer, Integer, Symbol, Symbol, Symbol}, {Integer, Integer, Symbol,
>>      Symbol, Symbol}, {
>>    Integer, Integer, Symbol, Symbol, Symbol}, {Integer, Integer,
>> Symbol,
>>      Symbol, Symbol}, {
>>    Integer, Integer, Symbol, Symbol, Symbol}, {Integer, Integer,
>> Symbol,
>>      Symbol, Symbol}, {
>>    Integer, Integer, Symbol, Symbol, Symbol}, {Integer, Integer,
>> Symbol,
>>      Symbol, Symbol}, {Integer, Integer, Symbol, Symbol, Symbol}}
>>
>> That is, they are all Symbols.  We can re-write your pattern to be more
>> flexible and we can use Cases[] instead of Select[].  (IME Cases[] is
>> easier to figure out.)
>>
>> In[3]:=
>> Cases[data, {1, _Integer, _, _, _}]
>> Out[3]=
>> {{1, 1, string1, c, d}, {1, 2, string2, c, d}, {
>>    1, 3, string3, c, d}, {1, 4, string4, c, d}}
>>
>> So that gets you the preliminary result.  But you want to extract the
>> member of this list that has the maximal second element.
>>
>>> 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!
>>
>> Let's say you want to know the maximum integer that occurs in slot #2
>> for all of the data that contain string3.
>>
>> In[4]:=
>> Max[Part[#,2]&/@Cases[data,{_Integer,_Integer, string3,_,_}]]
>>
>> Out[4]=
>> 3
>>
>> This code extracts the second part from all of the list elements that
>> match {_Integer, _Integer, string3, _,_} and finds the maximum value
>> thereof.
>> --
>> Curt Fischer
>>
>
>
>
>



-- 
DrBob at bigfoot.com
www.eclecticdreams.net


  • Prev by Date: IMS 2005: Second announcement and call for submissions
  • Next by Date: Re: Quite Upset with NIntegrate
  • Previous by thread: Re: Re: Using Select with arrays? (Relative newbie)
  • Next by thread: Re: Using Select with arrays? (Relative newbie)