2016-07-05 109 views
0

我有一些数据,看起来像这样第一和最后一个功能SAS

data example1;  
    input Activity $ logflag; 
    Activity1 1 
    Activity2 1 
    Activity3 1 
    Activity4 1 
    Activity1 2 
    Activity2 2 
    Activity3 2 
    Activity1 3 
    Activity2 3 
    Activity3 3 
    Activity4 3 
    Activity1 4 
    Activity2 4 
    ; 
run; 

凡基本上每次变量“logflag”增量1“活动”返回到“活动1”但是,我想要去这个;

data example2;  
    input Activity $ logflag count; 
    Activity1 1 1 
    Activity2 1 2 
    Activity3 1 3 
    Activity4 1 4 
    Activity1 2 1 
    Activity2 2 2 
    Activity3 2 3 
    Activity1 3 1 
    Activity2 3 2 
    Activity3 3 3 
    Activity4 3 4 
    Activity1 4 1 
    Activity2 4 2 
    ; 
run; 

。由此我有一个“计数”,其通过1每一个新的“活动”出现某种“logflag”内的时间增量。

我正在使用的是这个;

data AS2.TENMAY_EXAMPLE4; 
    set AS2.TENMAY_SESSIONID; 
    by logflag Activity notsorted; 
    if first.logflag then count=0; 
    if first.Activity then count+1; 
run; 

和我得到这个

data example2;  
    input Activity $ logflag count; 
    Activity1 1 1 
    Activity2 1 2 
    Activity3 1 2 
    Activity4 1 2 
    Activity1 2 1 
    Activity2 2 2 
    Activity3 2 2 
    Activity1 3 1 
    Activity2 3 2 
    Activity3 3 2 
    Activity4 3 2 
    Activity1 4 1 
    Activity2 4 2 
    ; 
run; 

我不能明白的是为什么由1计数器递增,那么转到2,但此后再也没有获得为3或更高。我确信我有这个工作,但我无法弄清楚我改变了什么。

任何人都可以提供帮助吗?

感谢,

+1

检查并确保您的输入数据集不具有变量COUNT。 – Tom

+0

Hi @Tom。谢谢。这实际上是个问题。为什么我的输入中包含一个名为COUNT的变量很重要? – Taylrl

回答

1

您必须已经在输入数据集中有一个名为COUNT的变量。 因此,每次SET语句运行时,来自输入数据集的值都会覆盖前一个观测值。

为了得到你的例子,COUNT对每个观察值可能都是1。因此,当ACTIVITY更改时递增时,它将变为2.每个LOGFLAG组的第一个观察值为1,因为在将其增加之前首先将其设置为0。

0

输入数据:

data example1; 
    attrib Activity format = $20. 
     logflag format = 8.; 
    input Activity $ logflag; 
    Activity1 1 
    Activity2 1 
    Activity3 1 
    Activity4 1 
    Activity1 2 
    Activity2 2 
    Activity3 2 
    Activity1 3 
    Activity2 3 
    Activity3 3 
    Activity4 3 
    Activity1 4 
    Activity2 4 
    ; 
run; 

要拍摄的结果,你想试试这个什么:

data example2; 
    set example1; 
    by logflag Activity notsorted; 
    if first.logflag then count=1; 
    else count+1; 
run; 

结果是:

Activity logflag count 
--------- ------- ----- 
Activity1 1  1 
Activity2 1  2 
Activity3 1  3 
Activity4 1  4 
Activity1 2  1 
Activity2 2  2 
Activity3 2  3 
Activity1 3  1 
Activity2 3  2 
Activity3 3  3 
Activity4 3  4 
Activity1 4  1 
Activity2 4  2 

enter image description here

+0

我运行了这段代码,它仍然给了我同样的东西,从而计数不会增加任何高于2.我可以看到你的代码在这里应该工作,就像我上面使用的代码。我很困惑。 – Taylrl

+0

@Taylrl,这真是太棒了:) –

+0

在这里发生了一件非常奇怪的事情。我的结果与你的不同。我将调查并报告:-S – Taylrl

0

您缺少retain声明。每次datastep循环变量被重置。 Retain可以抑制这种行为。

data AS2.TENMAY_EXAMPLE4; 
    set AS2.TENMAY_SESSIONID; 
    retain count; 
    by logflag Activity notsorted; 
    if first.logflag then count=0; 
    count+1; 
run; 
+0

谢谢@Jetzler,但是即使使用这个'retain'声明,我仍然会得到相同的结果,伯爵不会增加过去2.所有在这里我会认为应该已经工作的解决方案。必须有我们缺少的东西 – Taylrl

+1

是的,没错。刚刚检查过它。使用总和函数'x + y;'具有内建保留。所以它应该一直工作。因此,问题必须出现在您的输入数据或您系统的设置中。 – Jetzler

相关问题