导入前在特定列中转置和重命名变量的SAS代码

时间:2019-05-01 18:25:26

标签: sas rename transpose sas-macro

我正在使用下面提供的宏来导入几个效果很好的csv文件。但是,在导入之前,我很难将数据集中的第3列和第6列从列转换为行。然后,我想将这些列分别重命名为日期和学习。

(例如,现在每个文件在第3列中都有不同的日期作为列名,我想将其移至该行并为该列取一个新名称,即日期,以便在我设置所有导入文件时下方的所有其他内容都将在名为WKWebView的列中

我不知道每个文件中第3列的名称。因此,例如在文件1中,它可以在文件2中分别命名为dateXYZ,而我想同时命名为YYXdateXYZ代替排。示例如下:

在文件1中:

YYX

在文件2中:

| Pt | Rt | XYZ |
|----|----|------|
| 1  | 2  |       |

结果应如下所示:

| Pt | Rt | YYZ |
|----|----|------|
| 3  | 4  |       |

代码:

| Pt | Rt | date |
|----|----|-------|
| 1  | 2  | XYZ |
| 3  | 4  | YYX |

代码最初来自:https://github.com/statgeek/SAS-Tutorials/blob/master/Import_all_files_one_type

Edit1 :如第一条评论中所述。

Edit2 :添加了指向代码源的链接。

1 个答案:

答案 0 :(得分:1)

为什么不只用一个数据步就完成整个过程? SAS可以直接读取CSV文件,而无需使用PROC IMPORT。

在文件名中使用通配符一次读取所有文件。 当您位于文件的第一行时,请从标题行中读取日期。

%let path=C:\Users\baidw002\Documents\1 BCH-LJAF\Real data transfer (BCH to UAB)\CGM\cgmtestfiles\machine\csv;
data want ;
  length pt 8 rt 8 date 8 ;
  informat date anydtdte.;
  format date yymmdd10.;

  length dummy $1 fname $256;
  infile "&path/*.csv" filename=fname truncover dsd ;
  input @;
  if fname ne lag(fname) then do;
    input 2*dummy date ;
    retain date;
  end;
  input pt rt ;
  drop dummy;
run;

所以,如果我组成一些虚拟文件:

%let path=%sysfunc(pathname(work));
data _null_;
  file "&path/test1.csv";
  put 'pt,rt,3/4/19' / '1,2';
  file "&path/test2.csv";
  put 'pt,rt,4/5/19' / '3,4';
run;

我得到这个结果:

Obs    pt    rt          date

 1      1     2    2019-03-04
 2      3     4    2019-04-05