2015-01-22 28 views
9

Próbuję posortować listę list w R. Każda podlista zawiera liczbę całkowitą i ciąg znaków. Moim celem jest uporządkowanie list tak, aby ostatnia lista była sortowana według liczb całkowitych w porządku rosnącym. Poniżej znajduje się przykład tego, co próbuję wykonać:Jak sortować listę list w R?

a <- list(-5,"help") 
b <- list(3, "stack") 
c <- list(1, "me") 
d <- list(10, "overflow") 

list.of.lists <- list(a,b,c,d) 
magic.sort(list.of.lists) 
# Below is not exactly how it would be displayed, but should be understandable 
-5, "help" 
1, "me" 
3, "stack" 
10, "overflow" 

Czy istnieje dobry sposób w obrębie R, aby osiągnąć ten wynik? Najlepiej, jeśli wynik powinien zostać zwrócony jako lista list.

Odpowiedz

16

Spróbuj tego:

list.of.lists[order(sapply(list.of.lists,'[[',1))] 
+0

Dzięki za szybką i poprawną odpowiedź! Próbowałem to zaakceptować, ale wydaje mi się, że muszę poczekać kilka minut! Kiedy zegar tyka, akceptując to, czy mimo to możesz wyjaśnić, co robi każda część? Jestem bardzo zdezorientowany przez twoje użycie sapply. Co oznacza "[[" określić? Ponadto, jaki jest ostatni argument w określaniu sapply? Jestem nowy dla R ... – mjnichol

+2

@mjnichol - z długiej ręki, możesz napisać: 'sapply (list.of.lists, function (x) x [[1]])' - to właśnie wyodrębnia pierwszy element z każdą listę, a następnie zwracając ją jako wektor, który następnie jest przekazywany do 'order'. Na przykład. - '[[1]]' i ''[[' (a, 1)' są równoważne. – thelatemail

+0

Ah, tak jakby to wymyśliłem. Dziękuję Ci! – mjnichol

1

Masz dużo struktury w swoim list.of.lists. W zależności od innych procesów trzeba zrobić, możesz zrobić to w liście dwuwymiarowej tak:

list.2d <- sapply(list.of.lists, cbind) 

oraz, ewentualnie, stamtąd do ramki danych, takich jak ten:

df <- data.frame(t(list.2d)) 

(Z technicznego punktu widzenia ramka danych jest rodzajem listy.) Sortowanie według określonego zestawu kolumn i wyodrębnianie podzbiorów elementów może być nieco bardziej konwencjonalne. (Chociaż bardzo podoba mi się tutaj zaakceptowana odpowiedź.)