2017-04-04 3 views
4

Ich möchte die Reihenfolge zwischen Elementen in einem Vektor erhalten. Hier ist ein reproduzierbares Beispiel.Finde Reihenfolge zwischen Elementen in einem Vektor

vec <- c('a', letters[2:7], 'a', letters[9:14], 'a', letters[16:21]) # sample data 
ind_a <- which(grepl('a', vec)) # indices matching the character 'a' 
ind_a <- c(ind_a, length(vec)+1) # concatenate the length of 'vec' + 1 with indices 
ind_a 
# [1] 1 8 15 22 

Nun, wie die Sequenz zwischen den Elementen der ind_a zu berechnen. Zum Beispiel seq(from = 2, to = 7, by = 1) und das Gleiche für andere.

Vorzugsweise möchte ich irgendeine Funktion in der Basis R für diese Aufgabe kennen.

Erwartete Ausgabe

# List of 3 
# $ : int [1:6] 2 3 4 5 6 7 
# $ : int [1:6] 9 10 11 12 13 14 
# $ : int [1:6] 16 17 18 19 20 21 

Antwort

4

Wir schaffen zwei Vektoren von ‚ind_a‘ durch die letzten und ersten Beobachtungen zu entfernen, dann die Reihenfolge der entsprechenden Elemente erhalten mit Map

Map(seq, ind_a[-length(ind_a)]+1, ind_a[-1]-1) 
#[[1]] 
#[1] 2 3 4 5 6 7 

#[[2]] 
#[1] 9 10 11 12 13 14 

#[[3]] 
#[1] 16 17 18 19 20 21 

Oder wie @ Zelazny7 vorgeschlagen, das Entfernen der ersten und letzten Element kann mit head und tail Funktion

getan werden 210
Map(`:`, head(ind_a, -1) + 1, tail(ind_a, -1) - 1) 
+2

Alternative Syntax: 'Karte (Seq, Kopf (ind_a, -1) + 1, Schwanz (ind_a, -1) - 1)' – Zelazny7

2
lapply(2:length(ind_a), function(i) setdiff(sequence(ind_a[i] - 1), sequence(ind_a[i-1]))) 
#OR  
lapply(2:length(ind_a), function(i) (ind_a[i-1]+1):(ind_a[i]-1)) 

#[[1]] 
#[1] 2 3 4 5 6 7 

#[[2]] 
#[1] 9 10 11 12 13 14 

#[[3]] 
#[1] 16 17 18 19 20 21 
Verwandte Themen