SAS数据每个人只应出现一次

时间:2013-07-02 14:28:43

标签: sql sas

我有下表,我对某些科目有一些组合。

SubjectSet1,SubjectSet2,更多信息......

1,1

1,2

1,3

2,2

2,3

2,4

3,1

3,3

3,2

4,1

我需要一种方法来编程SAS,以便每个主题只出现一次。例如,给出以下结果:

SubjectSet1,SubjectSet2,更多信息......

1,2

2,4

3,3

4,1

4 个答案:

答案 0 :(得分:1)

问题含糊不清。但如果你想来自:

1,1
1,2
1,3
2,2
2,3
2,4
3,1
3,3
3,2
4,1

类似于:

1,2
2,4
3,3
4,1

假设您的表 Table1 有两个名为 Field1 Field2 的字段,您需要一个PROC SQL,但第一个只有一个不同的领域。 像

这样的东西
select distinct Field1
from Table1

或者您可以使用PROC SORT中的NODUPKEY执行相同的操作:

proc sort data=Table1 NODUPKEY;
by Field1;
run;

答案 1 :(得分:1)

假设您正在尝试随机选择样本,使得每个主题在每个位置最多出现一次,下面是一个解决方案:

data have;
infile datalines dlm=',';
input SubjectSet1  SubjectSet2;
rannum=ranuni(10);
datalines;
1,1
1,2
1,3
2,2
2,3
2,4
3,1
3,3
3,2
4,1
;;;;
run;

proc sort data=have;
by rannum;
run;

data want;
set have;
length subj1list subj2list $32767;
retain subj1list subj2list '|';
*if the current record is not in either of the subject lists, then...;
if not find(subj1list,cats('|',SubjectSet1,'|'))
and not find(subj2list,cats('|',SubjectSet2,'|'))
then do;
    *add it to each of the lists and output into the want dataset;
    subj1list=cats(subj1list,SubjectSet1,'|');
    subj2list=cats(subj2list,SubjectSet1,'|');
    output;
end;
drop subj1list subj2list;
run;

我添加一个随机数,按它排序,然后使用一对字符变量作为简单的哈希表来存储以前选择的响应者。这个解决方案相当快,但有局限性,特别是SAS(32767)中的最大字符大小,所以它不能用于超过几千条记录。

优秀的解决方案是使用实际的哈希表,但我不确定它是不是过于复杂。如果此解决方案由于样本大小问题而无法正常编写,则无法正常工作。

答案 2 :(得分:1)

如果你真的不关心你要保留哪一行,你可以使用PROC SORT的NODUPKEY选项:

data have;
   input subject somevar;
   datalines;
1 1
1 2
1 3
2 2
2 3
2 4
3 1
3 3
3 2
4 1
run;

proc sort nodupkey data=have out=want;
   by subject;
run;

这导致输出数据集具有subject的唯一观察值。保留的行将是源数据中出现的第一个BY变量的不同值。请谨慎使用,并确保这是您真正想要做的事情。

答案 3 :(得分:0)

您可以使用proc sql

执行此操作
select distinct subjectSet1, SubjectSet2
from t;