如何在R中的for循环中选择n个最低值,n个最低值除了最低值等?

时间:2017-12-14 11:16:43

标签: r for-loop

R中,我想创建一个for循环,其中我要选择n个最低值,然后是n个最低值,不包括最低值,然后是n个最低值,不包括2个最低值价值观等。

以下是一个澄清的例子:

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

我想得到:

 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

我尝试了以下代码,但后来我没有得到最后一行(不包括最后/最高值)。我可以通过在for循环中添加另一个代码行来获得这个,但是想知道这是否可以更高效地完成。

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)]}

由于

1 个答案:

答案 0 :(得分:1)

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

获取模式:

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])

现在,在R中使用动态编程来完成(在一般情况下):

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

最完美的一个:

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

请注意sapply提供了列式输出,因此转置完成了不便之处。

Rob注意:申请家人(applymapplysapplytapply等)会覆盖for。因此,你应该尽可能长时间地使用这个家庭。