2010-12-10 18 views
8

Coś łatwego, jak sądzę.Sortuj tablicę według kolumny tekstowej w Mathematica

Mam dwuwymiarową listę (tablicę) mieszanych danych daty, tekstu i danych liczbowych pochodzących z pliku CSV. Chcę móc sortować wiersze według wartości w jednej kolumnie, która w tym przypadku jest datą w formacie tekstowym. Na przykład:

{{1/12/2008, Bob, 123}, {28/06/2007, Alice, 456}, {19/08/2009, Charlie, 789}}

Chciałbym sortować wiersze w liście do dnia (tak, że wychodzi w kolejności Alice, Bob, Charlie.)

Dotychczas myślałem że może chcę map DateList całej mojej kolumnie data i poprzedzić rok, miesiąc i dzień do listy, więc staje się:

{{2008, 12, 1, Bob, 123}, {2007, 6, 28, Alice, 456}}

Wtedy pozostaje mi konieczności zrobić trzy rodzaje zamiast jednego i konieczność rozbicia tablicy o rok. To nie wydaje się właściwe, a teraz utknąłem. Wiem, że to powinno być proste, ale nie mogę tego zrozumieć. Wszelkie wskazówki są mile widziane.

Dzięki,

Tim

Odpowiedz

11

Być może ...

l = {{"1/12/2008", Bob, 123}, {"28/06/2007", Alice, 456}, 
    {"19/08/2009", Charlie, 789}} 

SortBy[l, AbsoluteTime[{#[[1]], {"Day", "Month", "Year"}}] &] 

daje

{{"28/06/2007", Alice, 456}, 
{"1/12/2008", Bob,  123}, 
{"19/08/2009", Charlie, 789}} 

HTH

Edycja

Zauważ, że Sortowanie [] porównuje użyciu OrderedQ [], a więc można go porównać list. (Greater [] na przykład nie może).

więc poniższy kod działa również:

[email protected]([email protected]{DateList[{#[[1]],{"Day","Month","Year"}}], #[[2]], #[[3]]} & /@ l) 

lub może bardziej elegancki:

[email protected](l/.{x_String, y__} :> [email protected]{DateList[{x, {"Day", "Month", "Year"}}], y}) 
+0

legendy. Dzięki Belizariusz, który działał idealnie. Spędziłem wiele godzin przeglądając dokumenty i nigdy nie widziałem odniesienia do SortBy, ani AbsoluteTime! –

+0

+1, nigdy wcześniej nie słyszałem o "SortBy". Zawsze używałem opcji "Sortuj" oraz niestandardowych funkcji sortowania. – rcollyer

+0

Ja też lubię to rozwiązanie (i ja też nie słyszałem o AbsoluteTime). Niewielka różnica polega na tym, że funkcja DateList (z której grałem) będzie działać tak samo, jak: SortBy [l, DateList [{# [[1]], {"Day", "Month", "Year"}} ] &] // TableForm – tomd

2

alternatywą dla Belizariusza Drugi sposób:

lst = {{"1/12/2008", Bob, 123}, 
     {"28/06/2007", Alice, 456}, 
     {"19/08/2009", Charlie, 789}}; 

lst = {[email protected]{#, {"Day", "Month", "Year"}}, ##2} & @@@ lst; 

[email protected] 
+0

Tak, lubię DateList :-) – tomd