我被难住了。
我想将一个非常大的数据集减少为更少的观测值,但要包含原始数据集的所有级别(最多)一次这样做是为了测试的目的,所以我们最感兴趣的是得出具有最少obs数量的最终数据集。
所以如果我们以数据集sashelp.class为例。我想找出第一个OBS(或任何非特定的OBS),但我觉得第一个/最后一个OBS更容易覆盖每个原始数据集的级别,而不是所有可能的(现有的或理论的)所需变量的组合。
输出如下所示:(sashelp.class:按年龄、性别划分的所有级别):
年龄有6个不同的层次(11-16)
性有两个不同的层次(“f”,“m”)
理论上,覆盖这些级别的obs最少为6个。
所以我们最终应该:
OBS 1:受到惊吓,“M”,14岁
OBS#2:爱丽丝,“F”,13
芭芭拉、卡罗尔和亨利都不参加比赛,因为F-M和13-14都参加了比赛
OBS 3:詹姆斯,“M”,12岁
表4:Janet,“F”,15
表5:Joyce,“F”,11
表6:Philip,“M”,16
输出结束
在这种情况下,我们按顺序遍历数据,我们发现满足要求的obs(6)的最小数量,但是如果级别变得更长(或相互关联),并且数据分类(假设我们可以预先排序),我们可能会得到一些接近最小的值,但不是所需变量中最长级别的最小值。
我想这需要某种递归算法来获得最有效的少量obs来覆盖这些值,但不知道从哪里开始。任何帮助将不胜感激!
最佳答案
这不是一个非常有效的方法,但是它给出了期望的结果
/* sort by first key */
proc sort data=sashelp.class out=minset;
by age;
run;
/* set wantflag to 1 if first.key else wantflag is 0 */
data minset;
set minset;
by age;
if first.age then wantflag = 1;
else wantflag = 0;
run;
/* repeat proc sort and next data step for each consecutive key */
/* sort by second key and by descending wantflag */
proc sort data=minset out=minset;
by sex descending wantflag ;
run;
/* set wantflag to 1 if first.key, do NOT set to 0 if not key */
data minset;
set minset;
by sex;
if first.sex then wantflag = 1;
run;
/* finally keep smallest possible dataset */
data minset (drop=wantflag );
set minset;
if wantflag eq 1 then output;
run;
关于algorithm - 数据集的最低观测值可以涵盖所有必需级别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19634246/