SAS代码,用于在导入前转换和重命名特定列中的变量

SAS代码,用于在导入前转换和重命名特定列中的变量,sas,rename,transpose,sas-macro,Sas,Rename,Transpose,Sas Macro,我使用下面提供的宏导入几个csv文件,效果非常好。然而,在导入之前,我很难将数据集中的第3列和第6列从列转换到行。然后我想将这些列分别重命名为date和study (例如,现在每个文件在第3列中都有一个不同的日期作为列名,我希望将该列名带到下一行,并为该列指定一个新名称,即日期,这样当我将所有导入的文件设置为一个低于另一个时,所有文件都将位于名为date的列中) 我事先不知道在我的每个文件中第3列的名称。例如,在文件1中,它可以在文件2中命名为XYZ和yyyx,我想同时命名date,并将XYZ和

我使用下面提供的宏导入几个csv文件,效果非常好。然而,在导入之前,我很难将数据集中的第3列和第6列从列转换到行。然后我想将这些列分别重命名为date和study

(例如,现在每个文件在第3列中都有一个不同的日期作为列名,我希望将该列名带到下一行,并为该列指定一个新名称,即日期,这样当我将所有导入的文件设置为一个低于另一个时,所有文件都将位于名为
date
的列中)

我事先不知道在我的每个文件中第3列的名称。例如,在文件1中,它可以在文件2中命名为
XYZ
yyyx
,我想同时命名
date
,并将
XYZ
yyyx
带到行中。举例如下:

在文件1中:

| Pt | Rt | XYZ |
|----|----|------|
| 1  | 2  |       |
在文件2中:

| Pt | Rt | YYZ |
|----|----|------|
| 3  | 4  |       |
结果应该如下所示:

| Pt | Rt | date |
|----|----|-------|
| 1  | 2  | XYZ |
| 3  | 4  | YYX |
代码:

代码源于:

Edit1:如第一条评论所示


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

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

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

%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

您的程序正在使用PROC IMPORT读取文件。所以,除非你想改变,否则你真正的问题可以从一个SAS数据集的例子开始,并解释你需要改变什么。听起来好像你只是想重命名第三列,但你事先不知道它当前的名称。因此,请展示一个示例数据集以及您希望如何更改它。@Tom感谢您的评论。我根据你的评论更新了我的问题。所有的文件都有相同的结构吗?如果是这样,为什么您要使用PROC IMPORT而不是数据步骤来读取它们?SAS如何识别每个文件中的“日期”列,因为它们都有不同的名称,即XYZ和YYX?它给出错误:该代码正在读取标题行的第三个值作为
date
变量。它还假定它看起来像一个日期值,并将其存储为SAS日期值。您可以修改类型(长度)、信息和格式以将其作为其他内容读取。您的图片没有显示足够的日志来诊断错误。可以简单地将一些不可见的字符粘贴到编辑器窗口中。该变量的格式不应为日期变量,因此它的格式不应为mmddyy。只需将其作为字符读取即可。如果不是约会,为什么叫它date?日期写为_3_4_19
Obs    pt    rt          date

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