web-dev-qa-db-ja.com

R-関数を使用してベクトルをフィルター処理する

私はこれに似た機能を持っています:

_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 ]を試しましたが、機能しません:-)

ありがとう!!

38
MadSeb

Vectorize ベクトルで呼び出す関数が必要です:

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

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
52
42-

ここが一番簡単な方法だと思います

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

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

可能な場合は、ベクトル化された関数を作成する習慣を身に付けてください。たとえば、関数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テクニックはより一般的に役立ちます。

4