我有下表,其中有一些主题的组合。
主题集1,主题集2,更多信息...
1,1
1,2
1,3
2,2
2,3
2,4
3,1
3,3
3,2
4,1
我需要一种对 SAS 进行编程的方法,以便每个主题都只出现一次。例如,给出以下结果:
主题集1,主题集2,更多信息...
1,2
2,4
3,3
4,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) 中的最大字符大小方面,因此它不能用于超过几千条记录。
更好的解决方案是使用实际的哈希表,但我不确定这是否过于复杂。如果由于可以合理轻松编写的样本大小问题而导致此解决方案不起作用。
问题模棱两可。但如果你想从:
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;
如果您真的不在乎要保留哪一行,则可以使用 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
。谨慎使用并确保这是您真正想要做的。
你可以这样做proc sql
:
select distinct subjectSet1, SubjectSet2
from t;