我有下表,我对某些科目有一些组合。
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
答案 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;