【问题标题】:SAS DATA: How to remove observations that only occur onceSAS DATA:如何删除只出现一次的观察结果
【发布时间】:2012-11-04 03:36:15
【问题描述】:

在 SAS 中,假设我有一个名为“person_groups”的数据集。它有两个变量,名为“person”和“group”。该数据集只是将每个人分配到一个组。

如何从该数据集中删除所有组中没有其他人的人?换句话说,我怎样才能删除所有单例组?

[我很乐意使用proc sql 解决方案或data step 解决方案——两者都可以。]

旁注:我是 SAS 新手。多年来我一直在使用 C++ 和 MATLAB。我觉得我无法理解如何使用 SAS DATA 步骤执行任何操作。它看起来非常笨重、怪异和不雅。坦率地说,我越来越沮丧。外面的人对疲倦的人有希望吗? :)

【问题讨论】:

    标签: sas datastep


    【解决方案1】:

    这是一种使用数据步骤的方法。此方法需要排序。

    data person_groups;
     input person $ group $;
     datalines;
    John Grp1
    Mary Grp3
    Joe Grp2
    Jane Grp3
    Frank Grp1
    ;
    
    Proc Sort data=person_groups;
     by group;
    run;
    
    Data person_groups;
     set person_groups;
     by group;
     if first.group and last.group then delete;
    run;
    

    【讨论】:

    • 谢谢。在数据步骤中使用“by”语句和“delete”语句似乎非常有用。了解他们之后,我想我现在可以做得更多。
    【解决方案2】:

    这是PROC SQL 解决方案:

    proc sql;
       delete from person_groups
       where group in (
          select group
          from person_groups
          group by 1
          having count(*) = 1
          );
    quit;
    

    如您所见,PROC SQL 大多遵循标准的 ANSI 语法,因此您现有的 SQL 技能应该是相当可移植的。并在 SAS Data Step 编程方面坚持下去;语言极其丰富,功能齐全,绝不是“不雅”。你可能见过不优雅的代码,但这更有可能是程序员的错。花几分钟阅读SAS Concepts manual

    【讨论】:

    • 非常感谢。也许我应该尝试更多地依赖 proc sql 而不是 SAS 数据步,至少在我了解更多关于数据步编程的知识之前。 proc sql 可以做数据步骤可以做的大部分事情吗?谢谢,我一定会阅读该手册。
    • 数据步骤的一个方便方面是,当您执行 MERGE 并使用 IN= 选项标识数据集时,您可以确定每条记录的合并状态。您只需在数据步骤中通过一次即可获得此信息,但我相信使用 PROC SQL 需要多次通过。虽然,每个数据集都必须在数据步骤之前进行排序,所以它最终可能会提高清洗效率。
    • 如果您打算使用 SAS,我绝对建议您学习数据步进技术。我想大多数事情都可以在其中完成,但肯定有一些事情你宁愿在数据步骤中做 - 大概就像这个;我希望数据步解决方案更快。
    猜你喜欢
    • 2013-07-12
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2021-06-27
    相关资源
    最近更新 更多