【发布时间】:2015-09-28 01:29:17
【问题描述】:
抱歉标题令人困惑,但我不知道如何命名我正在尝试做的事情。我的目标是创建一个包含 1000 个 obs 的数据集,每个数据集都是运行的长度。我创建了一个阶段 1 数据集,从中生成了一组控制限制。我现在要做的是创建一个最有可能使用 rnorm 的阶段 2 数据集。我试图做的是创建一个重复循环,该循环将在阶段 2 数据集中不断创建值,直到其中一个值超出阶段 1 数据集产生的控制限制。例如,如果我有 3.0 和 -3.0 作为控制限制,phase2 数据集将创建一堆观察值,直到 obs 398,此时此处的值恰好是 3.45,从而停止创建数据。然后我的目标是记录数字 398。此外,我试图将代码循环回阶段 1 数据集/控制限制部分并创建一组新的控制限制,然后运行另一个阶段 2,直到我记录了 1000 个运行长度.我为阶段1/控制限制提供的代码工作正常,如下所示:
nphase1=50
nphase2=1000
varcount=1
meanshift= 0
sigmashift= 1
##### phase1 dataset/ control limits #####
phase1 <- matrix(rnorm(nphase1*varcount, 0, 1), nrow = nphase1, ncol=varcount)
mean_var <- apply(phase1, 2, mean)
std_var <- apply(phase1, 2, sd)
df_var <- data.frame(mean_var, std_var)
Upper_SPC_Limit_Method1 <- with(df_var, mean_var + 3 * std_var)
Lower_SPC_Limit_Method1 <- with(df_var, mean_var - 3 * std_var)
df_control_limits<- data.frame(Upper_SPC_Limit_Method1, Lower_SPC_Limit_Method1)
我之前在 SAS 中创建了这段代码,它看起来像这样。可能是我试图实现的目标的更好参考,然后我试图解释它。
%macro phase2_dataset (n=,varcount=, meanshift=, sigmashift=, nphase1=,simID=,);
%do z=1 %to &n;
%phase1_dataset (n=&nphase1, varcount=&varcount);
data phase2; set control_limits n=lastobs;
call streaminit(0);
do until (phase2_var1<Lower_SPC_limit_method1_var1 or
phase2_var1>Upper_SPC_limit_method1_var1);
phase2_var1 = rand("normal", &meanshift, &sigmashift);
output;
end;
run;
ods exclude all;
proc means data=phase2;
var phase2_var1;
ods output summary=x;
run;
ods select all;
data run_length; set x;
keep Phase2_var1_n;
run;
proc append base= QA.Phase2_dataset&simID data=Run_length force; run;
%end;
%mend;
还一直在研究使用 while 循环代替重复循环。 我是 R 新手,因此非常感谢您提出的任何想法。谢谢!
【问题讨论】:
标签: r while-loop repeat