我有一个类似于这个函数的函数:
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 ]
,但它不起作用 :-)
谢谢!!
有一个名为 "Filter" 的函数可以完全满足您的需求:
Filter( isGoodNumber, v)
#[1] 5 5 5 5
有一种选择是创建一个向量化的函数,可以通过使用Vectorize
函数(已经介绍过)或使用ifelse
来编写,还有一种类似于"Filter"的函数。
可以选择创建一个向量化函数,通过使用Vectorize
函数(如前所述),或编写ifelse
函数,或创建类似于“Filter”的函数。
isGoodNumber3 <- function(X)
{ X[ ifelse(X==5, TRUE,FALSE)]
}
isGoodNumber3(v)
#[1] 5 5 5 5
v
的答案,如果 v
是计算表达式,这是一件好事。 - krlmlrv %>% .[sapply(.,isGoodNumber)]
。 .
引用了 v 对象,sapply 将 isGoodNumber
应用于 v 中的每个元素。 - Thomas Luechtefeld我认为这里是最简单的方法
> v<-c(1,2,3,4,5,5,5,5)
> v[v==5]
[1] 5 5 5 5
isGoodNumber = Vectorize(isGoodNumber)
v[isGoodNumber(v)]
> 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
来完成这一点,因为对于非常大的向量,它会变得很慢。ifelse
替换if ... then ... else
。例如: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
技巧通常更有用。
v[v==5]
将会起到作用。 - Chaseifelse
并不是if
的向量化版本。if
函数旨在执行代码。它将执行第二个或第三个参数中的任何内容。执行的代码可能相当复杂,并且分配会保留在调用环境中。ifelse
函数仅返回从两组可能值之间选择的值向量。在替代方案中包括分配将不成功。认为它们相似会导致错误的结论。 - IRTFM