【发布时间】:2012-07-07 19:49:21
【问题描述】:
您好,我正在尝试操作一个数字列表,我想在没有 for 循环的情况下这样做,使用 R 中的快速本机操作。操作的伪代码是:
默认情况下,起始总数为 100(对于零内的每个块)
从第一个零到下一个零,当累计总数下降超过 2% 时,将所有后续数字替换为零。
到此为止所有零内的数字块
累计总和每次重置为100
例如,如果以下是我的数据:
d <- c(0,0,0,1,3,4,5,-1,2,3,-5,8,0,0,-2,-3,3,5,0,0,0,-1,-1,-1,-1);
结果是:
0 0 0 1 3 4 5 -1 2 3 -5 0 0 0 -2 -3 0 0 0 0 0 -1 -1 -1 0
目前我有一个带有 for 循环的实现,但是由于我的向量很长,所以性能很糟糕。
提前致谢。
这是一个运行示例代码:
d <- c(0,0,0,1,3,4,5,-1,2,3,-5,8,0,0,-2,-3,3,5,0,0,0,-1,-1,-1,-1);
ans <- d;
running_total <- 100;
count <- 1;
max <- 100;
toggle <- FALSE;
processing <- FALSE;
for(i in d){
if( i != 0 ){
processing <- TRUE;
if(toggle == TRUE){
ans[count] = 0;
}
else{
running_total = running_total + i;
if( running_total > max ){ max = running_total;}
else if ( 0.98*max > running_total){
toggle <- TRUE;
}
}
}
if( i == 0 && processing == TRUE )
{
running_total = 100;
max = 100;
toggle <- FALSE;
}
count <- count + 1;
}
cat(ans)
【问题讨论】:
-
向我们展示您的 for 循环以及您迄今为止尝试过的内容
-
谢谢你,我用代码更新了帖子。感谢您的建议。
-
Reduce 函数对于向量的顺序处理很有用,但我不知道您要做什么。
max=100赋值远高于输入向量中的任何数字,并且“处理”变量从未初始化,所以据我所知,在第一次遇到非零后,“切换”永远保持 TRUE。如果提供有关该问题的一些背景信息可能会有所帮助。 -
嗨 DWin 请接受我最诚挚的歉意。为了美化stackoverflow格式的代码,我不小心删除了几行。我已经使用工作版本对其进行了更新,并且切换和处理现在按预期工作。您应该能够复制粘贴并运行它。
标签: r for-loop logic vectorization conditional-statements