如何循环矢量比较没有FOR的行

时间:2015-08-11 12:04:23

标签: r matrix vector

由于优化问题,我需要一些提示来在向量中进行有效循环但对于“FOR ...”循环。 乍一看,建议使用apply()sapply()等功能。

我有一个转换成矩阵的向量:

x1<-c(1,2,4,1,4,3,5,3,1,0)

循环通过向量,如果x [i]> x [i + 1],我需要替换所有x1 [i + 1] = x1 [i]。 例: 输入向量:

x1<-as.matrix(c(1,2,4,1,4,3,5,3,1,0))

输出矢量:

c(1,2,4,4,4,4,5,5,5,5)

我的方法是在apply()中使用用户函数,但是我在如何正确编码用户函数中x [i]和x [i + 1]的关系方面遇到了一些困难。 我非常感谢你的想法或提示。

2 个答案:

答案 0 :(得分:2)

我们可以使用ave执行此操作。 (使用vector x1)

 ave(x1,cumsum(c(TRUE,x1[-1]>x1[-length(x1)])), FUN=function(x) head(x,1))
 #[1] 1 2 4 4 4 4 5 5 5 5

我们根据OP的帖子中描述的条件创建分组变量。检查后续元素(x1[-1] - 删除的第一个元素)是否大于当前元素(x1[-length(x1)] - 删除最后一个元素)。

 x1[-1]>x1[-length(x1)]
 #[1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE

长度比矢量x1的长度小1。因此,我们附加TRUE以使长度相等,然后执行cumsum

 cumsum(c(TRUE,x1[-1]>x1[-length(x1)]))
 #[1] 1 2 3 3 4 4 5 5 5 5

我们将其用作ave中的分组变量,并选择第一个观察&#39; x1&#39; 在每个小组内

另一种选择是像以前一样得到逻辑索引(c(TRUE, x1[-1] > x1[-length(x1)])),否定它(!)以使TRUE变为FALSE,将FALSE变为TRUE,将TRUE值转换为&#39; NA&#39; (NA^(!...)),然后使用na.locf中的library(zoo)NA值替换为前一个非NA值。

 library(zoo)
 na.locf(x1*NA^(!c(TRUE,x1[-1]>x1[-length(x1)])))
 #[1] 1 2 4 4 4 4 5 5 5 5

答案 1 :(得分:2)

通常,您可以将Reduceaccumulate=TRUE一起用于累积操作

Reduce(max,x1,accumulate=TRUE)
# [1] 1 2 4 4 4 4 5 5 5 5

但正如@Khashaa所指出的那样,常见案例cumsumcumprodcummin以及您的cummax是有效的基本功能。

cummax(x1)
# [1] 1 2 4 4 4 4 5 5 5 5