将SAS观察中的所有变量串联

时间:2019-07-19 11:36:41

标签: sas

是否有一种通用的方式将观察中的每个变量连接为一个更大的变量,同时保留在数据集上进行proc打印时其外观的数字/货币字段格式。 (例如,参见sashelp.shoes)

这是您可以运行的一些代码,正如您在查看日志时所看到的那样,使用catx函数生成逗号分隔的输出会从数字变量中删除$货币符号和句点

proc print data=sashelp.shoes (obs=10);

run;
proc sql;
 select name into :varstr2 separated by ','
 from dictionary.columns
 where libname = "SASHELP" and
 memname = "SHOES";

 quit;


data stuff();

  format all $5000.;

  set sashelp.shoes ;

  all = catx(',',&varstr2.) ;

  put all;
  run;

任何解决方案都需要通用,因为它可以在格式不同的变量的不同数据集上运行。

4 个答案:

答案 0 :(得分:1)

具有vvalue和concat函数(||)的解决方案

它与“没有catx的解决方案”(最后一个)类似,但是通过 vvalue 函数而不是 put 进行了简化。

flask.

catx解决方案

sklearn.

如果没有/*edit sashelp.shoes with missing values in Product as test-cases*/ proc sql noprint; create table wocatx as select * from SASHELP.SHOES; update wocatx set Product = ''; quit; /*Macro variable for concat function (||)*/ proc sql; select ('strip(vvalue('|| strip(name) ||'))') into :varstr4 separated by "|| ',' ||" from dictionary.columns where libname = "WORK" and memname = "WOCATX"; quit; /*Data step to concat all variables*/ data stuff2; format all $5000.; set work.wocatx ; all = &varstr4. ; put all; run; 格式,则在宏变量varstr2中仅会命名,如果有格式,则在调用catx时它将以格式转换,例如,您需要如果变量为num类型,则为proc print data=SASHELP.SHOES; run; proc sql; select ifc(strip(format) is missing,strip(name),ifc(type='num','put('|| strip(name) ||','|| strip(format) ||')','input('|| strip(name) ||','|| strip(format) ||')')) into :varstr2 separated by ',' from dictionary.columns where libname = "SASHELP" and memname = "SHOES"; quit; data stuff(); format all $5000.; set sashelp.shoes ; all = catx(',',&varstr2.) ; put all; run; ;如果为char类型,则为dictionary.columns函数。您可以根据需要在put(Sales,DOLLAR12.)中添加任何条件。

如果不需要使用input函数,只需更改选择:

select into

没有catx的解决方案:

input

具有catx和缺失值的结果:

catx

不含catx和缺少值的结果:

enter image description here

答案 1 :(得分:1)

您可以使用导入和导出到csv文件:

filename tem temp;
proc export data=sashelp.SHOES file=tem dbms=csv replace;
run;

data l;
length all $ 200;
infile tem   truncover firstobs=2;
input all  1-200;
run;

P.S。 如果只需要串联char,则uou可以创建数据集中所有CHARACTER列的数组,然后遍历:

data l;
length all $ 5000;
set sashelp.SHOES;
array ch [*] _CHARACTER_;
do i = 1 to dim(ch);
    all=catx(',',all,ch[i]);
end;
run;

答案 2 :(得分:0)

PUT语句是最简单的方法。您无需知道变量名称,就可以使用_all_变量列表。

put (_all_) (+0);

它将采用变量附带的格式,如果您在FILE语句中使用了DSD选项,则结果为定界列表。

此练习的最终目标是什么?如果要创建文件,则可以直接写该文件。

data _null_;
   set sashelp.shoes(obs=3);
   file 'myfile.csv' dsd ;
   put (_all_) (+0);
run;

如果您确实想将该字符串放入数据集变量中,则无需发明一些新功能。通过创建一个文件,然后从文件中读取各行,只需利用PUT语句功能即可。

filename junk temp;
data _null_;
   set sashelp.shoes(obs=3);
   file junk dsd ;
   put (_all_) (+0);
run;
data stuff ;
  set sashelp.shoes(obs=3);
  infile junk truncover ;
  input all $5000.;
run;

enter image description here

您甚至可以在不创建全文文件的情况下进行操作。而是一次只写一行,然后使用_FILE_自动变量将行保存到变量中。

filename junk temp;
data stuff;
  set sashelp.shoes(obs=3);
  file junk dsd lrecl=5000 ;
  length all $5000;
  put @1 (_all_) (+0) +(-2) '  ' @;
  all = _file_;
  output;
  all=' ';
  put @1 all $5000. @;
run;

答案 3 :(得分:0)

您可以手动循环数据集的PDV变量,并用vvaluex连接检索到的每个格式化值。散列可用于跟踪要处理的数据集中的哪些变量。如果您要用逗号分隔值,则可能需要用双引号将包含逗号的格式值括起来。

data want;
  set sashelp.cars indsname=_data;

  if _n_ = 1 then do;
    declare hash vars();
    length _varnum 8 _varname $32;
    vars.defineKey('_n_');
    vars.defineData('_varname');
    vars.defineDone();
    _dsid = open(_data);
    do _n_ = 1 to attrn(_dsid,'NVAR');
      rc = vars.add(key:_n_,data:varname(_dsid,_n_));
    end;
    _dsid = close(_dsid);
    call missing (of _:);
  end;

  format weight comma7.;

  length allcat $32000 _vvx $32000;
  do _n_ = 1 to vars.NUM_ITEMS;
    vars.find();
    _vvx = strip(vvaluex(_varname));
    if index(_vvx,",") then _vvx = quote(strip(_vvx));
    if _n_ = 1 
      then allcat = _vvx;
      else allcat = cats(allcat,',',_vvx);
  end;

  drop _:;
run;