J'ai un simple vecteur de 20 éléments dans lequel toutes les valeurs sont NA.

a = rep(NA, 20)

À certains intervalles spécifiques, j'ai attribué quelques valeurs NA à 2

a[c(1, 8, 15, 20)] = 2

Maintenant, je veux attribuer toutes les valeurs après les valeurs 2 à 3. L'instruction suivante fonctionne bien, mais elle ajoute un nouvel élément au vecteur à l'index 21. Cependant, je ne veux pas augmenter la taille du vecteur.

a[which(a == 2) + 1] <- 3

Existe-t-il un moyen de vérifier les limites de ce vecteur et d'attribuer la valeur 3 uniquement dans les limites du vecteur?

1
Saurabh 31 oct. 2020 à 12:16

4 réponses

Meilleure réponse

Une autre façon est de ne pas faire la valeur nth du vecteur dans la comparaison. Au lieu de cela, nous comparerons uniquement à n-1.

a[which(head(a, -1L)  == 2) + 1] <- 3
1
Cole 31 oct. 2020 à 11:39

Une autre façon serait de stocker initialement le length de votre vecteur, puis de sélectionner les valeurs selon votre dimension initiale.

a = rep(NA, 20)
dim_a <- length(a) 
a[c(1, 8, 15, 20)] = 2
a[which(a == 2) + 1] <- 3

a[seq_len(dim_a)] #select all elements up until length of initial a

#2  3 NA NA NA NA NA  2  3 NA NA NA NA NA  2  3 NA NA NA  2
0
AlexB 31 oct. 2020 à 09:23

Vous pouvez supprimer les index supérieurs à la longueur de a.

a <- rep(NA, 20)
ind <- c(1, 8, 15, 20)
a[ind] = 2
new_ind <- ind + 1
new_ind <- new_ind[new_ind > 0 & new_ind < length(a)]
a[new_ind] <- 3
a
#[1]  2  3 NA NA NA NA NA  2  3 NA NA NA NA NA  2  3 NA NA NA  2
0
Ronak Shah 31 oct. 2020 à 09:19

Voici le plus simple que je puisse comprendre.

library(zoo)
a = rep(NA, 20)
a[c(1, 8, 15, 20)] = 2
a[which(a == 2 & index(a) < length(a)) + 1] <- 3
1
Saurabh 3 nov. 2020 à 14:17