Skip to content

Instantly share code, notes, and snippets.

@pachadotdev
Created June 3, 2016 04:12
Show Gist options
  • Save pachadotdev/760e41f9d63cdf7e7b3a3247a170b661 to your computer and use it in GitHub Desktop.
Save pachadotdev/760e41f9d63cdf7e7b3a3247a170b661 to your computer and use it in GitHub Desktop.
x1 = cm[,1]
n <- length(x1)
x1[(x1 != sort(x1,partial=n-1)[n-1]) & (x1 != sort(x1,partial=n-2)[n-2]) & (x1 != sort(x1,partial=n-3)[n-3])] <- 0
@gvegayon
Copy link

gvegayon commented Jun 3, 2016

Don't know if this helps but you can make it faster this way:

rm(list=ls())
n <- 1e3
x1 = (1:n)[order(runif(n))]

fun1 <- function(x) {
  x[(x != sort(x,partial=n-1)[n-1]) & (x != sort(x,partial=n-2)[n-2]) & (x != sort(x,partial=n-3)[n-3])] <- 0
  x
}


fun2 <- function(x) {
  i <- (n-1):(n-3)
  x[!(x %in% sort(x, partial=i)[i])] <- 0
  x
}

library(microbenchmark)

microbenchmark::microbenchmark(fun1(x1), fun2(x1))

identical(fun1(x1),fun2(x1))

# > microbenchmark::microbenchmark(fun1, fun2)
# Unit: nanoseconds
#  expr min lq   mean median   uq  max neval
#  fun1  45 46 103.41     46 49.5 5499   100
#  fun2  49 53  62.80     53 53.0 1052   100
# 
# > identical(fun1(),fun2())
# [1] TRUE

# Applying it to a matrix -----------------
X <- matrix(runif(100*1000), ncol=100)
microbenchmark(apply(X, 2, fun1), apply(X, 2, fun2))

identical(apply(X, 2, fun1), apply(X, 2, fun2))

# Creating elements

W <- apply(X, 2, fun2)
sapply(1:ncol(W), function(x) assign(paste0("x",x), W[,x], envir = .GlobalEnv))

Makes sense?

@pachadotdev
Copy link
Author

I never heard of microbenchmark but it is very clear

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment