2016-11-09 106 views
1

我有一个奇怪的问题与PROC意义和使用StackODSOutput选项。考虑这个例子。SAS 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; 

这个“stats”数据集有一个名为“Label”的变量。我知道这个变量是存在的,因为我做了一个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安装有问题吗?

MY SAS版本的SAS 9.3(9.03.01M2P08152012)。

谢谢。

Karthik。

根据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   
+0

代码工作正常,我。立即运行并再次检查,可能你在某处忘记了某处。你使用什么版本的SAS?我在9.4 TS1M3上。如果仍然无法运行,请在一次运行中从运行代码发布完整日志。 – Reeza

+0

我的SAS版本是SAS 9.3(9.03.01M2P08152012)。另外,我添加了完整的SAS日志。 – Karthik

+0

尝试设置'option validvarname = v7;'在开始时再试一次。如果不行,请发布proc内容的输出。我还建议提高技术支持。如果知道的问题,他们可以指出你在正确的方向。或者至少可以跟踪它。 – Reeza

回答

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

+0

这解决了这个问题。基本上,我必须添加“Option validvarname = V7;”声明,然后再调用PROC MEANS并将其恢复为默认的“Option validvarname = any;”之后。谢谢! – Karthik

1

我在运行代码时遇到同样的问题。我有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码,所以你可以看到,如果有任何非打印字符在那里。此datastep的输出是:

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

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

在标签变量寻找,首先将间隙仍显示它与下一个输出之间。十六进制代码包含了一些重复零:

4C6162656C0000002020202020202020

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

所以这是在“标签”变量名,这些ASCII零所导致的问题。 SAS只能将其显示为'标签',其中这些ASCII零(a.k.a ASCII空白)显示为空格。

修复

我不知道的方法指包含ASCII特殊字符列,所以我们可以做的是重新命名列。但是,我们仍然无法通过名称来引用“标签”,因此我们需要间接参考它。一种方法是使用阵列:

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

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

作为PROC MEANS中的一个错误,可能需要将SAS技术支持提出来,请随意使用尽可能多的答案。