Mam wektor i jestem w stanie zwrócić najwyższą i najniższą wartość, ale jak zwrócić 5 najwyższych wartości? Czy istnieje do tego proste rozwiązanie jednokierunkowe?Jak zwrócić 5 najwyższych wartości z wektora w R?
20
A
Odpowiedz
32
> a <- c(1:100)
> tail(sort(a),5)
[1] 96 97 98 99 100
2
Tak, head(X, 5)
gdzie X
jest twoim posortowanym wektorem.
12
x[order(x)[1:5]]
3
tail(sort.int(x, partial=length(x) - 4), 5)
Korzystanie sort.int z częściowym ma tę zaletę, że jest (potencjalnie) szybciej (potencjalnie) nie robi pełnego sortowania. Ale w rzeczywistości moja implementacja wydaje się nieco wolniejsza. Być może dzieje się tak dlatego, że przy częściowym parametrze! = NULL zamiast sortowania szybkiego używa się sortowania skorupowego?
> x <- 1:1e6
> system.time(replicate(100, tail(sort.int(x, partial=length(x) - 4), 5)))
user system elapsed
4.782 0.846 5.668
> system.time(replicate(100, tail(sort(x), 5)))
user system elapsed
3.643 0.879 4.854
+0
Jeśli zamiast tego użyjesz x <-runif (1e6), zobaczysz korzyści. Zauważ, że te 5 wartości, które otrzymasz, byłyby rzeczywiście najwyższymi 5, ale niekoniecznie w porządku posortowanym. – Tommy
lub 'głowicy (rodzaj (a, zmniejszając = PRAWDA), 5) ' – Marek
ogon jest nieznacznie szybszy niż głowy i zmniejszanie = PRAWDA > x <- rnorm (50000000) > system.time (ogon (sortowanie (x), 5)) układ użytkownik upływie 22,64 0,25 22,95 > system.time (łbem (sortowania (x, zmniejszając = PRAWDA), 5)) układ użytkownik upływie 23,26 0,20 23,51 – Thierry
@Thierry można powinny uruchom to więcej niż raz i poświęć średni czas. Bo myślę, że nie ma różnicy (statystycznie rzecz biorąc) na podstawie moich symulacji. – Marek