【问题标题】:Selecting one obs from multiple ones based on some conditions根据某些条件从多个obs中选择一个obs
【发布时间】:2022-01-03 22:33:24
【问题描述】:

我有一个数据集,其中包含具有多行的帐户。 我想根据一些过滤条件每个保留一个。 数据集是

Account Model Class Value
1         A     0     1.0
1         B     0     1.0
2         B     0     0.5
3         A     1     0.5
3         A     0     1.0

我想根据这些条件为每个帐户保留一行:

  • 如果一个帐户只有一行,则保留它,无论类别和型号。
  • 如果一个帐户有多行,则保持该帐户的模型 A 和类 = 1 或模型 A 和类什么的。

预期的输出是

Account Model Class Value
    1         A     0     1.0
    2         B     0     0.5
    3         A     1     0.5

代码在 SAS 中实现。 我的想法是为具有多行的帐户分配一个值,并仅选择满足上述条件的那些帐户。 但是我不知道如何选择只有一行的帐户。 我认为我可以只看一下 max Class,因为它会选择不管 Model(通常 Class 是与 Model A 关联的最高级别)。

【问题讨论】:

  • 类 = 1.0 或值 = 1.0?
  • 第 1 课。抱歉我的错误。我认为像 max 和 over partition by 这样的东西可能会起作用
  • 按你的条件排序,拿第一。在 SAS 中使用数据步骤来获得第一个。在 Teradata 中使用 ROW_NUMBER()。

标签: sas teradata-sql-assistant


【解决方案1】:

假设Class的最大值为1,您可以根据自己的条件对数据进行排序并输出第一个。

data have;
infile datalines;
input Account Model $ Class Value;
datalines4;;;;
1 A 0 1.0
1 B 0 1.0
2 B 0 0.5
3 A 1 0.5
3 A 0 1.0
;;;;
run;

proc sort out=stage1 data=have; by account model descending class;run;

data want;
   set stage1;
   by account model descending class;
   if first.account then output;
run;

但是我不知道如何选择只有一行的帐户。

您可以使用first.last. 数据步骤变量来选择仅出现一次的帐户。确实if first.account and last.account那么这意味着by组中只有一个观察值。

基本上,第一个。为 by 组中的第一个观测值分配值 1,为 by 组中的所有其他观测值分配值 0.请记住,在您的特定情况下,数据需要在应用 FIRST 之前按帐户排序。变量。

【讨论】:

  • BY 语句在排序和数据步骤(降序一词)中需要相同,并且您不需要第一个降序关键字。 NOTSORTED 使其语法正确,但结果不完全相同。
  • 你完全正确。谢谢你发现它。已编辑。
  • 感谢克米特。如果我想同时考虑模型和类并对其进行排序(例如,选择模型 A 和类 1),是否仍然可以先使用?
猜你喜欢
  • 2015-04-04
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多