2017-01-09 1 views
0

Pourquoi le masquage R ne fixe-t-il pas la longueur? C'estConserver la longueur du masque lors de la sous-sélection dans R

> v=c(1,2,3,4,5) 
> mask=c(T,T,T,T) 
> v[mask] 
[1] 1 2 3 4 5 

Au lieu de

> v[mask] 
[1] 1 2 3 4 

Comment puis-je faire cela?

+0

http Peut-être utiles: //stackoverflow.com/questions/9335099/implementation-of-standard-recycling-rules R recycle le plus petit vecteur. – PereG

Répondre

3

Ceci est dû au recyclage. Si les vecteurs ont des longueurs différentes, le vecteur le plus court est recyclé dans l'ordre indiqué.

Comparer les suivantes:

> mask=c(F) 
> v[mask] 
numeric(0) 

> mask=c(T) 
> v[mask] 
[1] 1 2 3 4 5 

> mask=c(T, F, T, F) 
> v[mask] 
[1] 1 3 5 

Dans le premier exemple, F est recyclé 5 fois, donc pas de valeurs sont imprimées - le contraire qui se passe dans le deuxième exemple.

Dans le troisième exemple 2 et 4 sont omis, car ils sont indexés avec F, mais le masque est recyclée pour obtenir un T pour l'élément 5

Modifier Le résultat recherché étant de 1, 2, 3, 4? Essayez masque < - c (T, T, T, T, F)

C'est ce qui permet énoncé comme

v[v != 5] 

Parce que la comparaison est recyclée sur le vecteur tout

+0

Ok, mais comment obtenir le résultat souhaité? – Manfredo

+0

mask = c (T, T, T, T, F) –

+0

Existe-t-il une solution plus générale? Parce que le masque peut réellement varier, je ne peux pas simplement laisser tomber le dernier élément. – Manfredo