2017-05-29 5 views
1

Il ya une petite chose que j'ai beaucoup de problèmes avec: disons que j'ai une matrice 10x10 aléatoire avec la colonne a que vous voyez ci-dessous. Ce que je veux maintenant faire est d'exclure toute ligne contenant un zéro dans la colonne a. De plus, toutes les valeurs après deux zéros consécutifs doivent être exclues pour que b soit le vecteur cible que je souhaite.Comment exclure un zéro dans un vecteur et des valeurs après deux zéros consécutifs?

a <- c(13, 7, 2, 0, 4, 3, 0, 0, 5, 8) 

b <- c(13, 7, 2, 4, 3) 

je l'ai déjà essayé d'appliquer la fonction diff avec différents lags mais rien de vraiment fonctionné jusqu'à présent. J'apprécie toute aide!

2ème exemple: d < - c (0, 0, 0, 0, 0,8, 0, 0, 0,4, 0, 0, 0,5, 0,1, 0, 0,1, 0,1)

les dix premiers éléments ne devrait pas être inclus, peut-être j'ai oublié de mentionner que je veux exclure toutes les valeurs juste après les deux premiers zéros consécutifs.

+0

Dans le 2ème exemple, alors aucun des éléments ne serait inclus, juste parce qu'il y a 4 0 consécutifs au début? Si ce n'est que 2 0 consécutifs alors après le 5ème élément, c'est à dire. 0.8, il y a 2 0 consécutifs désolé, je suis si confus avec votre 'dix premiers éléments ne devraient pas être inclus' – akrun

+0

0.8 0.4 0.5 0.1 0.1 0.1 est ce qu'il recrache. C'est juste que le 0.8/0.4 est trop, il n'exclut aucune valeur après les deux premiers inconvénients. zéros (à partir du derrière sur celui-ci). La chose est que je dois commencer à exclure les zéros en commençant par ce vecteur par exemple, si vous comprenez ce que je veux dire: garder les 0.1, sauter le zéro, garder 0.1 et 0.5, c'est tout, parce que deux zéros suivent – rapuu

+0

le commentaire précédent, les 2 premiers 0 consécutifs se produisent après 0,8. Quelle est votre sortie attendue – akrun

Répondre

1

Nous pouvons utiliser

a[cumsum(a == 0)<2 & a!=0] 
#[1] 13 7 2 4 3 

Pour les autres valeurs

a[cumsum(a == 0)>2 & a!=0] 
#[1] 5 8 

ou une autre option est

library(data.table) 
a1 <- a[seq_len(which((a== 0) & (shift(a, fill =0, type = 'lead')==0))-1)] 
b <- a1[a1!=0] 
b 
#[1] 13 7 2 4 3 
+0

@rapuu Mis à jour le message – akrun

+0

Mhh, j'ai appliqué le 2ème code à mes données réelles mais il contenait toujours des valeurs "avant" les deux zéros consécutifs sont apparus. – rapuu

+0

@rapuu Vous vouliez dire 'a [cumsum (a == 0)> 2 & a! = 0]'. Pourriez-vous mettre à jour votre question avec un autre exemple pour vérifier – akrun

1

Si vous souhaitez supprimer chaque 0 et tout qui vient après deux 0s consécutifs, yo u pourrait le faire de cette façon: la conversion de votre vecteur à une chaîne avec des nombres séparés par des virgules, en utilisant une expression régulière pour supprimer des éléments indésirables, puis reconvertir en forme numérique de vecteur:

## gsub("0\\,|(0\\,){2}.*","",..) removes every 0 and every two zeros followed by anything 
a = c(13,7,2,0,4,3,0,0,5,8) 
b = as.numeric(unlist(strsplit(gsub("0\\,|(0\\,){2}.*","",paste0(a,collapse=",")),","))) 

Ce retour:

[1] 13 7 2 4 3 

Si vous souhaitez supprimer chaque 0 et tout ce qui vient avant deux: 0 consécutifs

d = c(0, 0, 0, 0, 0.8, 0, 0, 0.4, 0, 0, 0.5, 0.1, 0, 0.1, 0.1) 
c = as.numeric(unlist(strsplit(gsub("0\\,|.*(0\\,){2}","",paste0(d,collapse=",")),","))) 

Ce RETOURS:

[1] 0.5 0.1 0.1 0.1 
+0

en utilisant ce code il dit: numérique (0), utilisé sur le 2ème exemple que j'ai édité dans le message original. @Lamia – rapuu