4

I have a huge panel data. I want to create a new data keeping only first observation of each group. How can I achieve it? For illustrative purpose;

mydata = {{1, a, aa}, {1, b, bb}, {1, c, cc}, {2, d, dd}, {2, e, 
    ee}, {3, f, ff}, {3, g, gg}, {3, h, hh}, {4, i, ii}, {4, j, 
    jj}, {4, k, kk}, {4, l, ll}, {4, m, mm}, {5, n, nn}, {5, o, 
    oo}, {7, p, pp}};

My final result should be:

myanswer = {{1, a, aa}, {2, d, dd}, {3, f, ff}, {4, i, ii}, {5, n, 
    nn}, {7, p, pp}};

Any help is greatly appreciated.

ramesh
  • 2,309
  • 16
  • 29

2 Answers2

5

This is a straightforward application of GatherBy and Map (/@):

First /@ GatherBy[mydata, First]

(* {{1, a, aa}, {2, d, dd}, {3, f, ff}, {4, i, ii}, {5, n, nn}, {7, p, pp}} *)

You could also use Part ([[]]) to get the first element of each group.

GatherBy[mydata, First][[All,1]]
Dr. belisarius
  • 115,881
  • 13
  • 203
  • 453
Verbeia
  • 34,233
  • 9
  • 109
  • 224
5
 First /@  Split[mydata, #1[[1]] == #2[[1]] &]
Dr. belisarius
  • 115,881
  • 13
  • 203
  • 453