在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)]}
由于
答案 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注意:申请家人(apply
,mapply
,sapply
,tapply
等)会覆盖for
。因此,你应该尽可能长时间地使用这个家庭。