Re: simple question
- To: mathgroup at smc.vnet.net
- Subject: [mg105226] Re: simple question
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Wed, 25 Nov 2009 02:30:44 -0500 (EST)
On 11/24/09 at 5:48 AM, fgutiers2002 at yahoo.com (Francisco Gutierrez) wrote: >Dear List: I have the following list: >ejemplo1={{1,0,2,2,0},{0,1,1,1,2},{2,0,0,1,1},{1,1,0,2,2},{1,0,2,0,1 >},{2,2,0,1,1},{2,1,1,1,2},{0,1,1,0,1}}; I want to group it, so that >the sublists of ejemplo1 that have identical values at positions 4 >and 5 are gathered together. So I did the following code: Split[ >Sort[ejemplo1,#1[[4]]>=#2[[4]] && #1[[5]]>=#2[[5]] >&],Take[#1,{4,5}]==Take[#2,{4,5}]&] >Works! The output in effect is: >{{{1,1,0,2,2}},{{0,1,1,1,2},{2,1,1,1,2}},{{2,0,0,1,1},{2,2,0,1,1}},{ >{1,0,2,0,1},{0,1,1,0,1}},{{1,0,2,2,0}}}, precisely what I wanted. Using version 7 of Mathematica, you can achieve the same grouping using GatherBy although the resulting groups will be returned in a different order. Given positions 4 and 5 are the last two positions GatherBy[ejemplo1,#[[-2;;]]&] results in the desired grouping which is confirmed by In[7]:= Sort[ Split[Sort[ejemplo1, #1[[4]] >= #2[[4]] && #1[[5]] >= #2[[5]] &], Take[#1, {4, 5}] == Take[#2, {4, 5}] &]] == Sort[GatherBy[ejemplo1, #[[-2 ;;]] &]] Out[7]= True >Now, how can I create a function for the general case (instead of >fixed positions 4 and 5, an arbitrary number of positions that act >as "gathering parameter")? If the positions to use as the "gathering parameter" are always the last n, then the following will work group[data_,n_]:=GatherBy[data,#[[-n;;]]&]