在向量中存储一个非零的数字的函数

时间:2014-08-26 02:50:19

标签: r

如何编写一个将任何值更改为0到0的函数?

我目前的做法:

> numbersGreaterZeroAreOne(c(0.001, 0, 1, 2, 3, 4))
[1] 1 0 1 1 1 1

和我的实施:

numbersGreaterZeroAreOne <- function(x) {
    x <- x/x
    x[is.na(x)] <- 0
    return(x)
}

但是,我认为我的功能有效,但我不太喜欢它,通过零和NaN值使用devision似乎不自然。

1 个答案:

答案 0 :(得分:2)

您可以使用向量分配[<-和逻辑运算符!=

> x <- c(0.001, 0, 1, 2, 3, 4)
> f <- function(x) { x[x != 0] <- 1; x }
> f(x)
# [1] 1 0 1 1 1 1

或者你可以做一点诡计

> g <- function(x) { as.logical(x)+0 }
> g(x)
# [1] 1 0 1 1 1 1

后者似乎要快得多

> library(microbenchmark)
> microbenchmark(f(x), g(x))
# Unit: nanoseconds
#  expr  min     lq median     uq   max neval
#  f(x) 2320 2642.5 2757.5 2864.0 24662   100
#  g(x)  955 1080.0 1408.0 1487.5 12219   100