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
4 Réponses :
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"
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"
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
Vous pouvez également essayer:
vector[cumsum(vector %in% c("b", "e")) == 1][-1] [1] "c" "" "d"
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.