首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将(内部现有的)列标题作为表的第一行插入

将(内部现有的)列标题作为表的第一行插入
EN

Stack Overflow用户
提问于 2020-07-08 14:18:40
回答 2查看 149关注 0票数 0

假设我们有一个表INPUT_TABLE,其中有四列namelatlonz,其中填充了许多数据集。例如,在SAS 中,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   name    lat        lon        z 
1  Germany 49.420469  8.7269178  17
2  England 51.5540693 -0.8249039 16
...

我将基于此PREPROCESSED_TABLEINPUT_TABLE切换到宏%tabl

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data V42.PREPROCESSED_TABLE;
   set V21.INPUT_TABLE;
   drop NAME;
run;

%tabl(libin=V42, file=PREPROCESSED_TABLE);

宏本身是不允许修改的。

除其他外,%tabl还编写了一个纯文本文件PREPROCESSED_TABLE.txt

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
49.420469|8.7269178|17
51.5540693|-0.8249039|16

我也希望把标题名称写出来,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lat|lon|z
49.420469|8.7269178|17
51.5540693|-0.8249039|16

我的想法是将PREPROCESSED_TABLE扩展到data步骤的某个地方--有人能帮我吗?如何读出内部存储的标头名称?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-09 04:20:23

考虑到ReezaTom的提示,我自己想出了一个解决办法:我们简单地调用宏%tabl两次,一次是使用带有列名的1行表,一次是使用数据。这种方法本质上相当于先将头附加到文件中,然后再将数据附加到文件中(只不过我需要担心%tabl在流程链中进一步添加的其他内容)。

我遇到的技术困难是如何从表输入表V21.INPUT_TABLE的元信息中提取这个列名为1行的表。

我的队友教我怎么做的。为了使它对每个人都是可测试的,我将为测试数据表sashelp.class演示这个步骤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
proc contents data=sashelp.class out=meta (keep=NAME VARNUM) noprint;
run;

proc sort data=meta out=meta2;
by VARNUM;
run;

proc transpose data=meta2 out=colheaders (drop=_NAME_ _LABEL_);
var name;
run;

因此,我们将有一个表colheaders,它只有一行包含表标题,按VARNUM排序,这是它们在原始表中出现的顺序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   COL1  COL2  COL3  COL4    COL5
1  NAME  SEX   AGE   HEIGHT  WEIGHT

问题解决了,至少在理论上是这样。

票数 -1
EN

Stack Overflow用户

发布于 2020-07-09 06:18:15

如果目标是创建一个带有变量名的一行文件,那么只需自己编写该文件即可。首先将名称放入数据集(按顺序排列),然后编写它们。例如,您可以使用PROC TRANSPOSE OBS=0 dataset选项来生成一个文件,每个变量只有一个观察。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 proc transpose data=V42.PREPROCESSED_TABLE(obs=0) out=NAMES ;
   var _all_ ;
 run;

然后您可以使用它来写入文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 data _null_;
   set names ;
   file 'preprocessed.txt' dsd dlm='|';
   put _name_ @ ;
 run;

如果还想将数据添加到同一个文件中,只需使用第二个数据步骤即可。确保在file语句上使用MOD选项,以便将数据行附加到现有文件中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data _null_;
  set V42.PREPROCESSED_TABLE;
  file 'preprocessed.txt' dsd dlm='|' mod;
  put (_all_) (+0);
run;

如果由于其他原因需要调用现有宏,则可以忽略它创建的文件。或者,如果由于某些原因,内容与文件的简单转储不同,那么您可以将文件与宏生成的文件的头连接起来。假设宏生成'PREPROCESSED_TABLE.txt‘,代码生成一行文件’file ers.txt‘。然后,这个步骤将同时读取并写入‘预处理_TABLE_w_Headers.txt’;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data _null_;
  file 'PREPROCESSED_TABLE_w_headers.txt';
  if _n_=1 then do;
    infile 'headers.txt';
    input;
    put _infile_;
  end;
  infile 'PREPROCESSED_TABLE.txt';
  input;
  put _infile_;
run;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62804507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文