【问题标题】:SAS PROC Means with StackODSOutput: A Variable called "Label"SAS PROC 意味着 StackODSOutput:一个名为“标签”的变量
【发布时间】:2016-11-09 19:15:12
【问题描述】:

我对 PROC 均值和使用 StackODSOutput 选项有一个奇怪的问题。考虑这个例子。

我首先创建一个虚拟数据集进行分析。

/* Step-1: Create a dummy dataset for analysis */
data ds1;
    label x = 'Variable X';
    label y = 'Variable Y';
    do i = 1 to 100;
        x = ranuni(1234);
        y = ranuni(5678);
        keep x y;
        output;
    end;
run;

然后,我使用 StackODSOutput 选项运行 PROC MEANS。这将创建一个名为“stats”的输出数据集。

/* Step-2: I run PROC means to capture the output in a dataset called stats */
proc means data=ds1 StackODSOutput mean;
    var x y;
    ods output summary=stats;
run;

这个“统计”数据集有一个名为“标签”的变量。我知道变量存在,因为我做了一个 proc 内容,我在那里看到了变量。

/* Step-3: Confirm visually that there is a variable called Label in stats dataset */
proc contents data=stats varnum; run;

但是,我似乎无法在任何地方引用这个名为“Label”的变量。例如,以下 PROC SQL 语句会生成错误。我能够毫无问题地引用“统计”数据集中的所有其他变量。

/* Step-4: But, I cannot seem to reference the variable called "Label" in stats dataset! */
proc sql;
    select Variable, Label from stats; 
quit;

错误如下:

43         proc sql; 
44          select Variable, Label from stats; 
ERROR: The following columns were not found in the contributing tables: Label. 
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements. 
45         quit;

你知道我做错了什么吗?我的 SAS 代码或 SAS 安装有问题吗?

我的 SAS 版本是 SAS 9.3 (9.03.01M2P08152012)。

谢谢。

卡提克。

根据 Reeza 的要求,这是完整的日志输出。

1                                                          The SAS System                          15:52 Wednesday, November 9, 2016

1          %_eg_hidenotesandsource;
5          %_eg_hidenotesandsource;
20         
21         /* Step-1: Create a dummy dataset for analysis */


22         data ds1;
23          label x = 'Variable X';
24          label y = 'Variable Y';
25          do i = 1 to 100;
26              x = ranuni(1234);
27              y = ranuni(5678);
28              keep x y;
29              output;
30          end;
31         run;

NOTE: The data set WORK.DS1 has 100 observations and 2 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds


32         
33         /* Step-2: I run PROC means to capture the output in a dataset called stats */
34         proc means data=ds1 StackODSOutput mean;
35          var x y;
36          ods output summary=stats;
37         run;

NOTE: The data set WORK.STATS has 2 observations and 3 variables.
NOTE: There were 100 observations read from the data set WORK.DS1.
NOTE: PROCEDURE MEANS used (Total process time):
      real time           0.06 seconds
      cpu time            0.03 seconds


38         
39         /* Step-3: Confirm visually that there is a variable called Label in stats dataset */
40         proc contents data=stats varnum; run;

NOTE: PROCEDURE CONTENTS used (Total process time):
      real time           0.03 seconds
      cpu time            0.03 seconds


41         
42         /* Step-4: But, I cannot seem to reference the variable called "Label" in stats dataset! */
43         proc sql;
44          select Variable, Label from stats;
ERROR: The following columns were not found in the contributing tables: Label.
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
45         quit;
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

2                                                          The SAS System                          15:52 Wednesday, November 9, 2016

46         /* What! */
47         
48         
49         
50         %_eg_hidenotesandsource;
62         
63         
64         %_eg_hidenotesandsource;
67         

【问题讨论】:

  • 代码对我来说很好用。一次运行它并再次检查,也许你在某个地方忘记了一些东西。您使用的是什么版本的 SAS?我在 9.4 TS1M3 上。如果仍然无法正常工作,请一次性发布运行代码的完整日志。
  • 我的 SAS 版本是 SAS 9.3 (9.03.01M2P08152012)。另外,我添加了完整的 SAS 日志。
  • 尝试设置'option validvarname=v7;'在开始时再试一次。如果不行,请发布 proc 内容的输出。我还建议通过技术支持来提高这一点。如果已知问题,他们可以为您指明正确的方向。或者至少可以跟踪它。
  • 找到一个格式正确的问题和一个有趣的问题真是令人耳目一新。点赞!
  • 这里是关于这个问题的讨论。 SAS 技术支持已注意到这一点。 communities.sas.com/t5/SAS-Enterprise-Guide/…

标签: sas


【解决方案1】:

这是一个错误。它创建一个带有尾随空格的变量名,如果 validvarname 设置为 ANY,这在 EG 中是可能的。

修复:

Option validvarname=V7;

https://communities.sas.com/t5/SAS-Enterprise-Guide/SAS-EG-won-t-recognize-a-variable-that-has-the-name-quot-Label/m-p/294936

【讨论】:

  • 这解决了问题。基本上,我必须添加“选项validvarname = V7;”在我调用 PROC MEANS 并将其转回默认值“Option validvarname=any;”之前的语句之后。谢谢!
【解决方案2】:

我在运行代码时遇到了和你一样的问题。我有 SAS 9.4 并且在 Linux 上运行。这是我最后对这个问题的评价:

data _NULL_;
  set stats;
  put _all_;
run;

表明“标签”的变量名称并不像看起来那样:

22         data _NULL_;
23           set stats;
24           put _all_;
25         run;

Variable=x Label   =Variable X Mean=0.461116 _ERROR_=0 _N_=1
Variable=y Label   =Variable Y Mean=0.525342 _ERROR_=0 _N_=2

注意变量名称“标签”和等号字符之间的空格。其他变量都不是这样的。可能变量名已损坏。

dictionary.columns表中的变量名加载到另一个表中并查看值:

proc sql;
  create table x as
  select name as nm from dictionary.columns
  where libname = 'WORK' and memname = 'STATS';
quit;

data _NULL_;
  set x;
  put nm= nm $hex32.;
run;

$HEX32. 格式将文本转换为 ASCII 代码,因此您可以查看其中是否有任何不可打印的字符。这个数据步的输出是:

22         data _NULL_;
23           set x;
24           put nm= nm $hex32.;
25         run;

nm=Variable 5661726961626C652020202020202020
nm=Label    4C6162656C0000002020202020202020
nm=Mean 4D65616E202020202020202020202020

查看Label变量,首先它和下一个输出之间仍然出现差距。十六进制代码包含几个重复的零:

4C6162656C0000002020202020202020

4C=L
61=a
62=b
65=e
6C=l
00=?
20=<space>

所以是“标签”变量名中的这些 ASCII 零导致了问题。 SAS 只能将其显示为“标签”,其中这些 ASCII 零(也称为 ASCII NULL)显示为空格。

修复

我不知道如何引用包含 ASCII 特殊字符的列,所以我们可以做的是重命名该列。但是,我们仍然不能通过名称来引用 'Label ',所以我们需要间接引用它。一种方法是使用数组:

data stats_fix;
  set stats;
  array c{*} _CHARACTER_;
  var=c[1];
  Label=c[2];
run;

查看输出数据集很奇怪。数据集有两个称为“标签”的变量。我们知道一个是“Label”,另一个是“Label000000”。

PROC MEANS 中将这个问题作为一个错误向 SAS 技术支持提出可能是值得的,请随意使用尽可能多的这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多