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 v
où isGoodNumber(v) == TRUE
Comment puis-je faire cela ?
v [ isGoodNumber(v) == TRUE ]
essayé mais ça ne marche pas :-)
Merci !!
Vous devrez Vectoriser la fonction pour l'appeler sur un vecteur:
isGoodNumber = Vectorize(isGoodNumber)
v[isGoodNumber(v)]
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
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
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
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.