2015-07-03 56 views
0

我在多个数据集中有一个共同的列ID。现在我正在查找某些ID在这些数据集中出现的次数。即使在一个数据集中多次出现ID,数据集中的visit仍被计为1使用indsname计算变量频率

因此给出m数据集,对于任何ID,值visit1m之间。

理想输出:

ID # Visit 
222 5 
233 5 
556 3 
... 
... 
667 1 

数据集:(他们没有相同的前缀,这是一个例子)。

数据1:(#的222访问是1,甚至出现两次)

ID col2 col3 ... 
21 
222 
222 

...

数据5:(#的222访问是1)

ID col87 col12 ... 
222 
623 
126 

我不知道如何从这开始。它好像是一本词典遍历。

回答

4

这不是测试,但沿线的东西应该工作:

/*Stack up all of your tables, keep 'ID' only*/ 
data have (keep=ID); 
set data: indsname=dsn; 
dsname = dsn; 
run; 

/*Proc SQL to get the job done*/ 
Proc sql; 
create table want as 
select ID, count(distinct dsname) as visit from have 
group by ID 
; 
quit; 
0

这里有一个数据步骤方法,假设所有数据集被编号的顺序排列。

基本上,你比较当前行到上一行的indsname值,如果它改变,增量次数由1.注意比平时的做法略有不同,以重新计数 - 我做后indsname检查,并1,之前不为0;这是因为在某些情况下,您可能会有两个具有不同indsname值的连续ID。由于我们不能在BY语句中使用INDSNAME,所以我们不能依赖SAS为我们“改变”值(就像我们使用嵌套的语句一样),所以我们必须按顺序执行它。

data data1; 
    do id = 1 to 20; 
    output; 
    end; 
run; 

data data2; 
    do id = 1 to 30 by 2; 
    output; 
    end; 
run; 

data data3; 
    do id = 1 to 30 by 3; 
    output; 
    end; 
run; 

data want; 
    set data: indsname=dsn; 
    by id; 
    count+ifn(dsn=lag(dsn),0,1); 
    if first.id then count=1; 
    if last.id then output; 
run; 
+1

由于0或1中的比较结果,不需要IFN()函数。count + dsn ne lag(dsn); – Tom