web-dev-qa-db-fra.com

R - Filtrer un vecteur à l'aide d'une fonction

J'ai une fonction similaire à celle-ci:

isGoodNumber <- function(X) 
{
if (X==5) return(TRUE) else return(FALSE)
}

I have a vector:
v<-c(1,2,3,4,5,5,5,5)

Je veux obtenir un nouveau vecteur contenant les éléments de visGoodNumber(v) == TRUE

Comment puis-je faire cela ?

v [ isGoodNumber(v) == TRUE ] essayé mais ça ne marche pas :-)

Merci !!

38
MadSeb

Vous devrez Vectoriser la fonction pour l'appeler sur un vecteur:

isGoodNumber = Vectorize(isGoodNumber)
v[isGoodNumber(v)]
24
David Robinson

Il y a une fonction nommée " Filter " qui fera exactement ce que vous voulez:

Filter( isGoodNumber, v)
#[1] 5 5 5 5

Il y aurait la possibilité de créer une fonction vectorisée, soit en utilisant la fonction Vectorize (déjà illustrée) soit en l'écrivant avec ifelse (également mentionnée) et il y aurait le option d'une fonction de type "Filtre"

 isGoodNumber3 <- function(X) 
   { X[ ifelse(X==5, TRUE,FALSE)]
   }

 isGoodNumber3(v)
#[1] 5 5 5 5
52
42-

Je pense que c'est la méthode la plus simple

> v<-c(1,2,3,4,5,5,5,5)
> v[v==5]
[1] 5 5 5 5
29
xjzhou

Utilisez mapply () :

> v <- c(1,2,3,4,5,5,5,5)
> newV <- mapply(function(X) { if (X==5) return(TRUE) else return(FALSE) }, v)
> newV
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
> v[newV == TRUE]
[1] 5 5 5 5
7
Alex Reynolds

Vous devriez prendre l'habitude d'écrire des fonctions vectorisées lorsque cela est possible. Par exemple, si vous écrivez une fonction f(x), assurez-vous qu'elle fonctionne lorsque x est un vecteur, et pas seulement un seul nombre. Ne comptez pas sur Vectorize pour le faire pour vous, car cela sera lent pour les très grands vecteurs.

Une technique utile consiste à remplacer if ... then ... else avec ifelse. Par exemple:

isGoodNumber <- function(X) 
{
  ifelse(X==5, TRUE, FALSE)
}
v<-c(1,2,3,4,5,5,5,5)
v [ isGoodNumber(v) == TRUE ]

Dans ce cas particulier, vous pouvez bien sûr rationaliser les choses:

isGoodNumber <- function(X) return(X==5)

ou même juste

v[v==5]

mais la technique ifelse sera plus généralement utile.

4
Alexander Hanysz