R - отфильтровать вектор с помощью функции - PullRequest
38 голосов
/ 13 февраля 2012

У меня есть функция, похожая на эту:

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 ]

52 голосов
/ 13 февраля 2012

Существует функция с именем " Filter ", которая будет делать именно то, что вы хотите:

Filter( isGoodNumber, v)
#[1] 5 5 5 5

Будет возможность сделать функцию векторизованной, либоиспользование функции Vectorize (уже проиллюстрировано) или запись ее с помощью ifelse (также упомянуто), и была бы опция функции, которая была бы похожа на «Filter»

 isGoodNumber3 <- function(X) 
   { X[ ifelse(X==5, TRUE,FALSE)]
   }

 isGoodNumber3(v)
#[1] 5 5 5 5
29 голосов
/ 07 января 2013

Я думаю, что здесь самый простой метод

> v<-c(1,2,3,4,5,5,5,5)
> v[v==5]
[1] 5 5 5 5
24 голосов
/ 13 февраля 2012

Вам понадобится Векторизация функция для вызова ее на векторе:

isGoodNumber = Vectorize(isGoodNumber)
v[isGoodNumber(v)]
7 голосов
/ 13 февраля 2012

Использование 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 голосов
/ 03 января 2014

Вы должны по возможности писать привычные функции.Например, если вы пишете функцию 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 техникабудет полезен в более общем смысле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...