2017-03-04 8 views
0

Ich habe eine Frage zum Finden von Indexwerten in einem Vektor.Den nächsten Index zu einem Wert finden in R

Sagen wir, ich habe einen Vektor wie folgt:

vector <- c(1,2,4,6,8,10) 

Und lassen Sie uns sagen, dass ich den Wert ‚5‘. Ich möchte den maximalen Index in "Vektor" so finden, dass er kleiner oder gleich dem Wert 5 ist. Im obigen Beispiel wäre dieser Index 3 (da 4 kleiner oder gleich 5 ist). Und falls ich stattdessen einen Vektor hatte wie:

vector <- c(1,2,4,5,6,8,10) 

Dann, wenn ich einen Wert von weniger finden waren als oder gleich 5 ist, würde dieser Index sein jetzt 4 statt 3.

Aber ich wollen auch die ersten und letzten Zeit finden diesen Index auftritt. Zum Beispiel, wenn ich einen Vektor, wie gehabt:

vector <- c(1,1,2,2,4,5,5,5,5,6,8,10) 

dann das erste Mal in diesem Index 6 und das letzte Mal in diesem Index wäre 9. Gibt es

einen Kurzschluss auftritt wäre auftritt, ein- Line-Methode, mit der ich diese Aufgabe ausführen könnte? Bisher habe ich die Funktion max (which (....)) benutzt, aber ich finde, dass diese Methode für große Datensätze extrem ineffizient ist, da sie buchstäblich Hunderte/Tausende von Werten auflistet, also würde ich gerne eine finden effizientere Methode, wenn möglich, die in einer Zeile passen kann.

Vielen Dank im Voraus.

+0

Wenn 'vector' sortiert ist, siehe'? FindInterval' - einmal mit "left.open = TRUE" und einmal mit "left" aufrufen.open = FALSE "sollte die zwei Indizes geben (plus ein bisschen' if' Manipulation zu distinct '<' von '<=' –

Antwort

3

können Sie den folgenden Code verwenden:

min(max(which(vector <= 5)), min(which(vector == 5))) 

Zuerst es alle Indizes sucht, wo vector kleiner oder gleich 5 mit which Funktion, dann nimmt sie die maximal ein.

Zweitens sucht es alle Indizes, wo vector gleich 5 ist und das Minimum nimmt.

Drittens nimmt es die erste dieser beiden Indizes

+0

Gibt es eine alternative Möglichkeit dies zu tun, so dass das "min" (oder "max") ist innerhalb der "which" -Funktion? Ich habe eigentlich einen sehr ähnlichen Code zu dem im Moment - das Problem, das ich habe, ist, dass ich einen extrem großen Datensatz habe, also was passiert ist, dass die "which" -Funktion Tausende von Werten zurückgibt und dann nimmt die "max" -Funktion dann den Maximalwert davon. Da ich hunderte Male iteriere, verursacht dies, dass mein Programm sehr langsam läuft, also suche ich nach einer effizienteren Methode, um diese Aufgabe zu erledigen. – ThePlowKing

+0

Für die 'min' Teil, Sie können einfach' which (vector == 5) [1] 'nehmen, aber ich bin mir nicht sicher, ob es die Laufzeit reduzieren würde – Pop

2

Sie verwenden können:

my_ind <- function(vec, num){ 
    ind <- which.max(vec == num) # Check for equality first 
    if(ind == 1L && vec[1L] != num){ 
    ind <- which.min(vec < num) - 1L 
    } 
    ind 
} 

my_ind(c(1,2,4,6,8,10), 5L) # 3 
my_ind(c(1,2,4,5,6,8,10), 5L) # 4 
my_ind(c(1,1,2,2,4,5,5,5,5,6,8,10), 5L) # 6 
my_ind(c(5,8,10), 5L) # 1 
my_ind(c(6,8,10), 5L) # 0 - returns 0 if all(vec > 5L) 
2

Vielen Dank für alle, die antwortete, ich fand tatsächlich eine extrem kurze, einzeilige Methode, dies zu tun durch Herunterladen eines Pakets BBmisc. Es hat Funktionen namens which.last und which.first, und sie führen die Aktionen aus, die ich brauche. Nochmals vielen Dank, dass Sie sich die Zeit genommen haben, zu antworten, ich weiß das zu schätzen.

+0

Siehe hier für die __c__ Quelle dieser Funktion - https://github.com/berndbischl /BBmisc/blob/95a625fe0bd92413910f8c4f8f9c79c801a96af9/src/which_first.c#L14 – Rentrop

0

Ich sehe keine Notwendigkeit für Pakete hier. Es scheint, als ob das Konstrukt which(x == max(x[x <= 5])) für Sie arbeiten würde.

x <- c(1, 2, 4, 6, 8, 10) 
which(x == max(x[x <= 5])) 
# [1] 3 

x <- c(1, 2, 4, 5, 6, 8, 10) 
which(x == max(x[x <= 5])) 
# [1] 4 

x <- c(1, 1, 2, 2, 4, 5, 5, 5, 5, 6, 8, 10) 
which(x == max(x[x <= 5])) 
# [1] 6 7 8 9 

Und die Min/Max-Index für Multiples Indizes zu finden, verwenden Sie head/tail.

+0

Unter der Annahme, dass ich Ich habe die Frage verstanden –

Verwandte Themen