Rob
Rob

Reputation: 1490

How to select the n lowest values, n lowest values excluding the lowest, etc. in a for loop in R?

In R, I want to make a for loop in which I want to select the n lowest values, then the n lowest values excluding lowest value, then the n lowest values excluding the 2 lowest values etc.

Here's an example to clarify:

set.seed(1) 
x <- round(rnorm(10,20,15)) 
n <- 4

I want to get:

 7  8 11 15
 8 11 15 23
11 15 23 25
15 23 25 27
23 25 27 29
25 27 29 31
27 29 31 44

I tried the following code, but then I do not get the last row (does not include last/highest value). I could get this by adding another code line in the for loop, but was wondering whether this could be done more efficient.

y <- matrix(data=NA, nrow=length(x)+1-n, ncol=n)
for (i in 1:(length(x)-n)) {y[i,] <- sort(x)[i:(i+n-1)]}

Thanks

Upvotes: 0

Views: 64

Answers (1)

Erdogan CEVHER
Erdogan CEVHER

Reputation: 1609

set.seed(1) 
x <- round(rnorm(10,20,15)) 
n <- 4

Get the pattern:

rbind(sort(x)[1:4], sort(x)[2:5], sort(x)[3:6], sort(x)[4:7], sort(x)[5:8], sort(x)[6:9], sort(x)[6:9], sort(x)[7:10])

Now, use dynamic programming in R to finish (in the general case):

matrix(c( sapply(1:(length(x)+1-n), function(i) sort(x)[i:(i+3)] )),nrow=length(x)+1-n, byrow=TRUE)
     [,1] [,2] [,3] [,4]
[1,]    7    8   11   15
[2,]    8   11   15   23
[3,]   11   15   23   25
[4,]   15   23   25   27
[5,]   23   25   27   29
[6,]   25   27   29   31
[7,]   27   29   31   44

The most perfect one:

t(sapply(1:(length(x)+1-n), function(i) sort(x)[i:(i+3)] ))
     [,1] [,2] [,3] [,4]
[1,]    7    8   11   15
[2,]    8   11   15   23
[3,]   11   15   23   25
[4,]   15   23   25   27
[5,]   23   25   27   29
[6,]   25   27   29   31
[7,]   27   29   31   44

Note that sapply provides columnwise outputs, hence a transpose finished the inconvinience.

Note to Rob: Apply family (apply, mapply, sapply, tapply etc.) overrides for. Hence, you should use this family as long as possible.

Upvotes: 0

Related Questions