Sql SAS数据每个人只能出现一次

Sql SAS数据每个人只能出现一次,sql,sas,Sql,Sas,下表列出了一些科目的组合 主题集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您可以使用proc-sql执行此操作: select distinct subjectSet1, SubjectSet2 from t; 您可以使用proc sql执行此操作: select distinct subjec

下表列出了一些科目的组合

主题集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

您可以使用
proc-sql
执行此操作:

select distinct subjectSet1, SubjectSet2
from t;

您可以使用
proc sql
执行此操作:

select distinct subjectSet1, SubjectSet2
from t;

这个问题模棱两可。但如果你想从以下方面出发:

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有两个名为Field1Field2的字段,您需要一个PROC SQL,但第一个字段上只有一个distinct。 差不多

select distinct Field1
from Table1
或者,您也可以在PROC SORT中使用NODUPKEY执行相同的操作:

proc sort data=Table1 NODUPKEY;
by Field1;
run;
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;

这个问题模棱两可。但如果你想从以下方面出发:

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有两个名为Field1Field2的字段,您需要一个PROC SQL,但第一个字段上只有一个distinct。 差不多

select distinct Field1
from Table1
或者,您也可以在PROC SORT中使用NODUPKEY执行相同的操作:

proc sort data=Table1 NODUPKEY;
by Field1;
run;
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;

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

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),因此它不能用于超过几千条记录


更好的解决方案是使用实际的哈希表,但我不确定这是否过于复杂。如果此解决方案因样本量问题而无法正常工作,则可以轻松编写。

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

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),因此它不能用于超过几千条记录


更好的解决方案是使用实际的哈希表,但我不确定这是否过于复杂。如果此解决方案因样本量问题而无法正常工作,则可以轻松编写。

如果您确实不在乎要保留哪一行,则可以使用PROC SORT的NODUPKEY选项:

proc sort data=Table1 NODUPKEY;
by Field1;
run;
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;

这将产生一个输出数据集,其中包含
主题的唯一观察结果。对于
BY
变量的不同值,保留的行将是源数据中出现的第一行。小心使用,确保这是你真正想要做的

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

proc sort data=Table1 NODUPKEY;
by Field1;
run;
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;

这将产生一个输出数据集,其中包含
主题的唯一观察结果。对于
BY
变量的不同值,保留的行将是源数据中出现的第一行。小心使用,确保这是你真正想要做的

我认为这不可行,因为它将返回所有原始数据集…我认为这不可行,因为它将返回所有原始数据集…您选择subject1/2对的规则是什么?你是如何选择“1,2”而不是“1,1”或“1,3”的?你选择主题1/2对的规则是什么?你如何选择“1,2”而不是“1,1”或“1,3”?请注意,你不一定会得到你在原始帖子中要求的行,也不会总是得到4-例如,将拉努尼的种子从10改为7,你会得到3,因为subjectset2中的某行在4,1可用之前选择了1。请注意,您不一定会得到您在原始帖子中要求的行,也不会总是得到4-例如,将Ranui中的种子从10更改为7,您将得到3,因为subjectset2中带有1的某行在4,1变为可用之前被选中。