Re: Using Select with arrays? (Relative newbie)
- To: mathgroup at smc.vnet.net
- Subject: [mg54234] Re: Using Select with arrays? (Relative newbie)
- From: Curt Fischer <tentrillion at gmail.NOSPAM.com>
- Date: Mon, 14 Feb 2005 00:57:50 -0500 (EST)
- References: <cup5ip$dsr$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
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
- Follow-Ups:
- Re: Re: Using Select with arrays? (Relative newbie)
- From: Hugo Mallinson <hfm21@cam.ac.uk>
- Re: Re: Using Select with arrays? (Relative newbie)