【问题标题】:Generating many tables from a single table in SAS从 SAS 中的单个表生成多个表
【发布时间】:2018-09-24 13:04:08
【问题描述】:

我在 SAS 中有一个表格,其中包含我想要的格式信息。我想将这些数据分类到给定的类别中。

我不知道如何从数据创建 xform 或格式文件。

示例表如下所示:

     TxtLabel  Type FmtName label   Hlo count
         .      I   FAC1f    0      O    1
        1996    I   FAC1f    1           2
        1997    I   FAC1f    2           3

我想在 1997 年之后或 1996 年之前的不同数据集中记录所有年份。

问题是我知道如何通过硬编码来做到这一点,但是这些文件每次都会更改数字,所以我希望使用表中的信息来生成 bin,而不是硬编码它们。

如何使用来自另一个数据集的列对数据进行分箱以进行分类?

编辑

我有两个数据集,一个看起来像我包含的那个,另一个有一个标题为“YEAR”的列。我想使用第一个数据集的类别对第二个数据集进行分类。在这种情况下,TxtLabel 中有两个可用年份。有多个这样的表,我正在研究如何从表中生成 PROC 格式代码,而不是对值进行硬编码。

【问题讨论】:

  • 你好,你能补充一下你在“......日期所有年份......”中的意思吗?谢谢
  • 您可以在 PROC FORMAT 上使用 CNTLIN 生成格式,但您没有明确定义您想要做什么。由于您在数据集中有 HLO,因此它似乎已设置为使用 PROC FORMAT。要使其工作,您需要添加开始/结束变量,但这很简单。
  • “使用来自另一个数据集的列”通常是对某些进程的“控制表”的另一种说法。这个另一个表的结构是什么?在其中可以找到什么值?将信息添加到您的问题中(不要将信息放在评论中)
  • 我知道如何通过硬编码来做到这一点... - 显示您的代码,以便我们知道您所知道的。然后可以进行泛化。

标签: sas code-generation binning


【解决方案1】:

这应该运行以创建所需的格式

Proc FORMAT CNTLIN=MyCustomFormatControlData;
run;

然后您可以在 DATA Step 中使用它,或将其应用于数据集中的列。

分箱数据可能被解释为“数据集拆分”,但您的问题并不清楚是否如此。通用任意拆分通常使用以下技术之一完成:

  • 墙纸源代码解析自宏变量,该宏变量由Proc SQLProc FREQ 步骤中收集的信息填充
  • 使用hash对象对内存中的记录进行分组的动态数据拆分,并通过.output()调用保存到数据集。

显式分箱示例代码

data want0 want1 want2 want3 want4 want5 wantOther;
  set have;
  * explicit wall paper;
  select (put(year,FAC1f.));
    when ('0') output want0;
    when ('1') output want1;
    when ('2') output want2;
    when ('3') output want3;
    when ('4') output want4;
    when ('5') output want5;
    otherwise output wantOther;
run;

这是宏生成的源代码可以产生的结构,需要

  • 一次确定要生成的when/output
  • 第二遍应用生成的代码行。

如果这是您正在尝试的数据处理:

  • 做一些研究(那里有大量信息)
  • 写一些代码
  • 如果遇到无法解决的错误,请提出新问题

过程格式

Proc FORMAT has a CNTLIN option 用于指定包含格式信息的数据集。 Output Control Data Set 文档中描述了输入控制数据集(即 CNTLIN)的预期结构和值。一些重要的控制数据列是:

FMTNAME
指定一个字符变量,其值为格式或信息名称。

标签
指定一个字符变量,其值与格式或信息相关联。

开始
指定给出范围起始值的字符变量。

结束
指定一个字符变量,该变量给出范围的结束值。

随着要创建的自定义格式的要求越来越复杂,您将需要在输入控件数据集中有更多的信息变量

【讨论】:

  • 这最终解决了我的问题,但我花了一点时间才得到它。我有一个后续问题:您可以在单个 CNTLOUT 中存储多种格式吗?第一列 FMTNAME 似乎暗示您可以在一个文件中有两种格式,但是当我尝试构建它并使用 CNTLIN 时它失败了?
  • 后续问题应作为新问题发布(参考前一个问题)。像往常一样,包括代码和错误/警告/注释消息;但是是的,CNTLOUT= 会输出一种以上自定义格式的格式数据,CNTLIN= 可以指定包含一种以上格式的格式数据。
  • 由于某种原因,它需要在这些格式出现在我的工作目录中之前手动刷新,我认为这是一个足够接近的子问题,不需要它自己的。可能不会。
猜你喜欢
  • 1970-01-01
  • 2014-12-10
  • 2011-03-18
  • 2015-10-02
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
相关资源
最近更新 更多