私はこれに似た機能を持っています:
_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)
_
v
の要素を含む新しいベクトルを取得したいisGoodNumber(v) == TRUE
どうすればいいですか?
v [ isGoodNumber(v) == TRUE ]
を試しましたが、機能しません:-)
ありがとう!!
Vectorize ベクトルで呼び出す関数が必要です:
isGoodNumber = Vectorize(isGoodNumber)
v[isGoodNumber(v)]
「 Filter 」という名前の関数があります。これは、必要な処理を正確に実行します。
Filter( isGoodNumber, v)
#[1] 5 5 5 5
Vectorize
関数を使用することによりベクトル化された関数を作成するオプションがあります(既に図解されている)、またはifelse
を使用して書き込むこともできます。 「フィルター」のような機能のオプション
isGoodNumber3 <- function(X)
{ X[ ifelse(X==5, TRUE,FALSE)]
}
isGoodNumber3(v)
#[1] 5 5 5 5
ここが一番簡単な方法だと思います
> v<-c(1,2,3,4,5,5,5,5)
> v[v==5]
[1] 5 5 5 5
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
可能な場合は、ベクトル化された関数を作成する習慣を身に付けてください。たとえば、関数f(x)
を記述している場合、x
が単一の数値ではなくベクトルである場合に機能することを確認してください。非常に大きなベクトルの場合は遅くなるため、これを行うためにVectorize
に依存しないでください。
便利な手法は、if ... then ... else
with ifelse
。例えば:
isGoodNumber <- function(X)
{
ifelse(X==5, TRUE, FALSE)
}
v<-c(1,2,3,4,5,5,5,5)
v [ isGoodNumber(v) == TRUE ]
この特定のケースでは、もちろん物事を合理化できます:
isGoodNumber <- function(X) return(X==5)
または単に
v[v==5]
しかし、ifelse
テクニックはより一般的に役立ちます。