2016-12-08 74 views
1

试图谷歌它并无法找到任何(也许这是我是完全noob)。SAS循环通过变化

我想在我的数据集中创建一个名为step的新变量,从1开始计数,直到customerid发生变化。

举例: 这是我得到的表:

Customerid Page  step 
1   Frontpage 
1   Middlepage 
2   Frontpage 
2   Middlepage 
2   Lastpage  
3   Frontpage 
3   Middlepage 

我想要什么:

Customerid Page  step 
1   Frontpage 1 
1   Middlepage 2 
2   Frontpage 1 
2   Middlepage 2 
2   Lastpage 3 
3   Frontpage 1 
3   Middlepage 2 

我得到现在:

Customerid Page step 
1 Frontpage 1 
1 Middlepage 2 
2 Frontpage 3 
2 Middlepage 4 
2 Lastpage 5 
3 Frontpage 6 
3 Middlepage 7 

我试图做到这一点在萨斯,但它没有工作:

data nordea_dk1; 
set nordea_dk; 
by custerimd; 
if first.customerid then do; 
step=1; 
step + 1; 
output; 
run; 
+0

确保输入数据集中不存在新变量“STEP”。这将阻止值被保留。 – Tom

+0

它不,它仅仅是为了举例,但仍然不起作用 –

+0

发布显示问题的示例数据。 – Tom

回答

1

检查SAS日志记录或错误。基本逻辑适用于您的测试数据。

data have ; 
input Customerid Page $20. ; 
cards; 
1 Frontpage 
1 Middlepage 
2 Frontpage 
2 Middlepage 
2 Lastpage 
3 Frontpage 
3 Middlepage 
; 

data want ; 
    set have ; 
    by customerid ; 
    if first.customerid then step=0; 
    step+1; 
run; 
+0

当我使用你的代码时,我也会得到。 是因为在真实数据集中customerid是一个文本字符串? –

+0

第一。标志不关心变量是数字还是字符。 – Tom

+0

在您的帮助下我发现问题!我已将customerid变量设置为名称: '访问者ID 'n 然后,我将其更改为ID,因为某种原因它的工作原理类似于:S。 –

0

几个语法项目,custerimd上有拼写错误,而do是不必要的。另外,这种情况下不需要output,因为它也会在数据步骤结束时输出。

就程序逻辑而言,您需要重置first.customerid上的步骤,并在其他值上增加它,因此需要另外一种情况。这应该是你在找什么:

data nordea_dk1; 
    set nordea_dk; 
    by customerid; 

    if first.customerid then 
     step=1; 
    else 
     step+1; 

run;  
+0

然后我这样做,它只是计数每个观察。它不会通过customerid变量对计数进行分组? 当它涉及到变量customerid中的新唯一ID时,我希望它重置为1。 –

+0

也许我应该提一下,customerid是一个文本变量,不知道这是否有任何影响? –

+0

它应该无关紧要,如果它是一个文本变量,是数据集排序? – pieceOpiland