SAS循环1骰子简单概念长解释

时间:2014-09-24 13:58:59

标签: loops sas

我遇到了关于循环的这个小问题,但我不知道如何去做。这就是问题所在。

两名球员都有兴趣进行骰子比赛。将一个骰子滚动直到任一个 一个五,然后立即出现一个六,或者一个六,然后 紧接着另外六个人。我们对哪个事件更有可能发生感兴趣 首先,一对5/6对,还是一对6/6对?玩家不确定游戏是否公平,并且会 喜欢调查。

所以我有一个名为work.dice的数据集,其中10 000个观察值代表骰子的10 000个角色(1“x”变量,取值1到6,概率相等,所以它只有1 000个观察数字1到6没有特别的顺序)。现在,每当我们获得5/6或6/6时,游戏就会重新启动。例如,滚动5/6/6计为5/6,而不是6/6。我必须使用SAS数据集work.dice创建两个新的SAS数据集fivesix和sixsix,每个包含一个变量NumRolls。变量NumRolls表示自上次重启以来骰子卷的数量。

我对此的理解是,例如,如果前7个数字是2,3,5,4,1,3,4,那么第8个和第9个是5,6,那么五个数据集需要为变量“NumRolls”记录“9”。然后,如果下一个说3个数字是1,5,4但是之后的2个是6,6,我们在数据集sixsix中为“NumRolls”记录5。

我正在努力使用“If-Then do”语句和循环,所以我会非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

既然你问了一个概念性问题,我会以实物回答。如果您想完成一些编程并提出更具体的编程问题,请随时提出一个新问题。

首先,这不需要循环。有一些不同的方法,但没有一个更常见的方法需要编码循环。那是因为SAS会愉快地执行您需要的唯一循环 - 数据步循环。这就是每个新观察中的内容,并对每个观察执行相同的代码。

使用最简单的工具集解决此问题的概念:

  • 计数器变量。您需要了解如何将retain的值从一行保存到下一行,以及如何执行简单操作,例如在适当的时间将其重置为零。
  • 将一个观察中的值与不同观察中的值进行比较的方法。这需要学习两种技术之一;要么使用lag队列,要么学习如何在新变量中retain来自先前观察的值,并在适当时重新设置该变量。
  • 如何构建和评估if语句以确定您感兴趣的条件是否为真。 if/then/do这是正确的想法;你需要学习如何使用它。

如果最后一位导致您遇到麻烦,那么您应该问一个关于如何使用if/then/do构造的问题,其中您提供了一个如何使用它的简单示例 - 请勿使用此问题作为您的示例,尽可能简单地使用示例,以便深入查看问题的核心。

答案 1 :(得分:1)

/* Create 10000 Random Rolls of Dice*/
data dice;
    do i=1 to 10000;
        x = int(ranuni(0) * 6 + 1);
        output;
    end;
run;

/* Partition Rolls to Datasets fivesix sixsix based on outcome*/
/* Data step creates two new datasets fivesix and sixsix from a provided dataset*/
/* The dataset dice is approximated above*/
/* For the first row in the datastep a new variable run_count is initialized*/
/* run_count takes the value 0 to begin*/
/* To increment run_count across rows, a retain statement is used*/
/* The lag function is used to create a new variable x_lag do allow reading both */
/* the current and previous rolls at the same time*/
/* In the event of a 5 followed by 6 or 6 followed by six, */
/* a count of how long it has been since the counter has been reset is calculated, */
/* the counter is reset, and the combination is outputted to the proper dataset*/
/* If neither combination is met, the counter simply increments. */
data fivesix sixsix;
    set dice;
    if _n_ = 1 then run_count = 0;
    retain run_count;
    x_lag = lag(x);
    if x = 6 and x_lag = 5 then do;
        NumRolls = run_count + 1;
        run_count = 0;
        output fivesix;
    end;
    else if x = 6 and x_lag = 6 then do;
        NumRolls = run_count + 1;
        run_count = 0;
        output sixsix;
    end;
    else do;
        run_count = run_count+1;
    end;
run;