4
votes

R: sous-ensemble du vecteur de caractères

Je souhaite obtenir un sous-ensemble à partir d'un vecteur de caractères. Cependant, je veux obtenir vector2 contenant des éléments du vecteur initial entre des éléments spécifiques.

#Expected result:
vector2
"c","","d"

comment récupérer tous les éléments entre les éléments "b" et "e" et obtenir vector2?

vector <- c("a", "", "b", "c","","d", "e")
vector


1 commentaires

Littéral (pas robuste): vector [(1 + match ("b", vecteur)): (- 1 + match ("e", vecteur))] , il existe probablement des méthodes plus robustes qui gèrent les manquements, les commandes en cours, etc.


4 Réponses :


2
votes

Voici une option

x <- charmatch(c("b", "e"), vector) + c(1, -1)
vector[seq.int(x[1], x[2])]
# [1] "c" ""  "d"

La première étape consiste à calculer idx comme

cumsum(vector %in% c("b", "e")) * !vector %in% c("b", "e")
# [1] 0 0 0 1 1 1 0

puis calculer la somme cumulée

cumsum(vector %in% c("b", "e"))
# [1] 0 0 1 1 1 1 2

multipliée par ! vecteur% dans% c ("b", "e") ce qui donne

vector %in% c("b", "e")
# [1] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE

convertir en un vecteur logique et l'utiliser pour sous-ensemble x.


Pour l'exemple donné, une autre option est charmatch

f <- function(x, left, right) {
  idx <- x %in% c(left, right)
  x[as.logical(cumsum(idx) * !idx)]
}

f(vector, "b", "e")
# [1] "c" ""  "d"


0 commentaires

2
votes

Vous pouvez également faire quelque chose comme ceci:

vector <- c("a", "", "b", "c","","d", "e")
vector[seq(which(vector=="b")+1,which(vector=="e")-1)]
#[1] "c" ""  "d"


0 commentaires

0
votes

Avec des indices négatifs:

(y <- rev(x))
#[1] "e" "d" ""  "c" "b" ""  "a"
y[-c(1:which(y == 'b'), which(y =='e'):length(y))]
#character(0)

Dans le cas où e est trouvé avant b , il renvoie un vecteur vide:

XXX


0 commentaires

0
votes

Vous pouvez également essayer:

vector[cumsum(vector %in% c("b", "e")) == 1][-1]

[1] "c" ""  "d"


0 commentaires