2017-06-15 7 views
3

J'ai un capteur qui mesure une variable et quand il n'y a pas de connexion, il retourne toujours la dernière valeur vue au lieu de NA. Donc dans mon vecteur je voudrais remplacer ces valeurs identiques par une valeur imptuée (par exemple avec na.approx).Remplacer la séquence de valeurs identiques de longueur> 2

set.seed(3) 
vec <- round(runif(20)*10) 
#### [1] 2 8 4 3 6 6 1 3 6 6 5 5 5 6 9 8 1 7 9 3 

Mais je ne veux que les séquences supérieures à 2 (3 nombres identiques ou plus) car 2 nombres identiques peuvent apparaître naturellement. (Dans l'exemple précédent, la séquence tag serait 5 5 5)

J'ai essayé de le faire avec diff pour marquer mes points identiques (c(0, diff(vec) == 0)) mais je ne sais pas comment faire face à la condition length == 2 ...

EDIT ma sortie attendue pourrait ressembler à ceci:

#### [1] 2 8 4 3 6 6 1 3 6 6 5 NA NA 6 9 8 1 7 9 3 

(La deuxième valeur identique d'une séquence de 3 ou plus est très probablement une mauvaise valeur trop)

Merci

Répondre

1

vous pouvez utiliser rle pour obtenir les indices des positions où NA devraient être affectés.

vec[with(data = rle(vec), 
    expr = unlist(sapply(which(lengths > 2), function(i) 
     (sum(lengths[1:i]) - (lengths[i] - 2)):sum(lengths[1:i]))))] = NA 
vec 
#[1] 2 8 4 3 6 6 1 3 6 6 5 NA NA 6 9 8 1 7 9 3 

En fonction

foo = function(X, length){ 
    replace(x = X, 
      list = with(data = rle(X), 
         expr = unlist(sapply(which(lengths > length), function(i) 
          (sum(lengths[1:i]) - (lengths[i] - length)):sum(lengths[1:i])))), 
      values = NA) 
} 
foo(X = vec, length = 2) 
#[1] 2 8 4 3 6 6 1 3 6 6 5 NA NA 6 9 8 1 7 9 3 
4

vous pouvez utiliser la fonction lag

set.seed(3) 
> vec <- round(runif(20)*10) 
> 
> vec 
[1] 2 8 4 3 6 6 1 3 6 6 5 5 5 6 9 8 1 7 9 3 
> 
> vec[vec == lag(vec) & vec == lag(vec,2)] <- NA 
> 
> vec 
[1] 2 8 4 3 6 6 1 3 6 6 5 5 NA 6 9 8 1 7 9 3 
> 
+0

cool. Est-il possible de remplacer également NA à partir de la deuxième 5 pas la troisième? (J'ai mis à jour ma sortie attendue) – agenis

+2

oui ce serait une étape supplémentaire 'vec [qui (is.na (vec)) - 1] <- NA' –

+0

ok, je pourrais aller avec ça, même si ça gâcherait avec" les "NA" naturels ... initialement présents dans le vecteur (cela peut arriver). Je devrais les imputer en premier. – agenis