【问题标题】:How can I make the first row of a SAS dataset the variable names?如何使 SAS 数据集的第一行成为变量名称?
【发布时间】:2019-02-06 15:57:19
【问题描述】:

我有一个已经导入的数据集,其中第一行包含变量名称。我知道通常在导入数据集时使用 getnames = yes。但是,如果数据已经导入,我如何使用数据步骤使第一行成为变量名称?

数据如下:

         A         B         C 
1      Name 1   Name 2     Name 3
2        2        4          66
3        3        5          6

【问题讨论】:

  • 如果变量是数字,则必须将其转换为字符。你确定吗?目的是什么?
  • 这是个坏主意,考虑添加标签吗?
  • 如果您尝试将包含标签和变量名称的文件导出为两行,这是一种方法:gist.github.com/statgeek/ae153e40af0d35dce02d1c8102ff3b94

标签: sas rename


【解决方案1】:

由于将名称作为数据读取可能会使所有变量都成为字符,因此您可以尝试将数据转置两次以修复它。这适用于小型数据集。

所以第一次转置会将当前名称放入_NAME_ 变量中,并将每一行转换为一列。第二个proc转置可以去掉原来的名字,用第一行(新的COL1变量)作为名字。

proc transpose data=have out=wide ;
 var _all_;
run;

proc transpose data=wide(drop=_name_ rename=(col1=_name_)) out=want(drop=_name_ _label_);
   var col:;
   id _name_;
run;

【讨论】:

    【解决方案2】:

    已导入数据的问题在于,所有数字数据可能都放置在字符变量中,因为导入过程看到的“第一行”数据包含一些字符数据,并推动了自动列构造的推断。

    无论如何,您都需要为每个必须重命名的变量构建重命名对old-name=new-name。第 1 行中的新名称使得 transpose 该行可以将这些名称部分排列为数据。带有:intoseparated by 的SQL 可以填充一个宏变量以在proc datasets 步骤中使用,该步骤执行列重命名,而无需重写整个数据集。最后,带有modify 的DATA 步可以remove 再次在适当的位置放置一行,而无需重写整个数据集。

    filename sandbox temp;
    
    data _null_;
      file sandbox;
      put 'A,B,C';
      put 'Name 1, Name 2, Name 3';
      put '2,4,66';
      put '3,5,6';
    run;
    
    proc import datafile=sandbox dbms=csv replace out=work.oops;
    run;
    
    proc transpose data=oops(obs=1) out=renames;
    var _all_;
    run;           
    
    proc sql noprint;
      select cats(_name_,"=",compress(col1,,"KN"))
      into :renames separated by ' '
      from renames;
    
    %put NOTE: &=renames;
    
    proc datasets nolist lib=work;
      modify oops;
      rename &renames;
    run;
    
    data oops;
      modify oops;
      remove;
      stop;
    run;
    
    %let syslast=oops;
    

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多