R - 使用函数过滤矢量

时间:2012-02-13 18:06:10

标签: r function vector

我有一个类似于这个的功能:

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 ]但不起作用: - )

谢谢!!

5 个答案:

答案 0 :(得分:51)

有一个名为“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

答案 1 :(得分:27)

我认为这是最简单的方法

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

答案 2 :(得分:23)

你需要Vectorize函数在向量上调用它:

isGoodNumber = Vectorize(isGoodNumber)
v[isGoodNumber(v)]

答案 3 :(得分:7)

使用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

答案 4 :(得分:4)

你应该养成在可能的情况下编写矢量化函数的习惯。例如,如果您正在编写函数f(x),请确保x是一个向量,而不仅仅是一个数字。不要依赖Vectorize为你做这件事,因为对于非常大的载体来说它会很慢。

一种有用的技巧是将if ... then ... else替换为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技术将更有用。