gpt4 book ai didi

algorithm - 从数据集中覆盖所有必需级别的最小 obs

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:42 25 4
gpt4 key购买 nike

我很难过。

我想将一个非常大的数据集缩减为更少的观察值,但一次(最多)包含原始数据集的所有级别。这样做是出于测试目的,因此提出具有最少 obs 数量的最终数据集符合我们的最大利益。

因此,如果我们以数据集 SASHELP.CLASS 为例。我想找出第一个 obs(或任何非特定的 obs,但我觉得使用 first/last obs 可能更容易)涵盖原始数据集的每个单独级别,不是 所需变量的所有可能(现有的或理论上的)组合。

输出看起来像这样:(SASHELP.CLASS:按年龄、性别分类的所有级别):

  • AGE 有 6 个不同的级别 (11-16)
  • SEX 有 2 个不同的级别(“F”、“M”)
  • 理论上涵盖这些级别的最少 obs 数量是 6。

所以我们最终应该得到:

  • OBS #1:Affred,“M”,14
  • OBS #2:爱丽丝,“F”,13 岁

Barbara、Carol 和 Henry 不会输出,因为 F-M 和 13-14 都被覆盖了

  • OBS #3:James,“M”,12 岁
  • OBS #4:珍妮特,“F”,15 岁
  • OBS #5:乔伊斯,“女”,11 岁
  • OBS #6:Philip,“M”,16 岁

输出结束

在这种情况下,我们按顺序检查数据,我们发现满足要求的最少 obs (6) 数量,但如果级别变得更长(或相互关联),并且数据分类(假设我们可以预先-sort),我们最终可能会得到一些接近最小值的东西,但不是所需变量中最长级别的最小值。

我想这将需要某种递归算法来最有效地获取少量 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 - 从数据集中覆盖所有必需级别的最小 obs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com