由于优化问题,我需要一些提示来在向量中进行有效循环但对于“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]的关系方面遇到了一些困难。
我非常感谢你的想法或提示。
答案 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)
通常,您可以将Reduce
与accumulate=TRUE
一起用于累积操作
Reduce(max,x1,accumulate=TRUE)
# [1] 1 2 4 4 4 4 5 5 5 5
但正如@Khashaa所指出的那样,常见案例cumsum
,cumprod
,cummin
以及您的cummax
是有效的基本功能。
cummax(x1)
# [1] 1 2 4 4 4 4 5 5 5 5