Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS-proc sql-选择属于同一列的列?_Sas_Multiple Columns_Proc Sql - Fatal编程技术网

SAS-proc sql-选择属于同一列的列?

SAS-proc sql-选择属于同一列的列?,sas,multiple-columns,proc-sql,Sas,Multiple Columns,Proc Sql,我想按列名拆分一个PROC-SQL中有许多(454)列的表(可能使用宏?) 例如:一列以“Column21….T”、“Column22….T”开头,等等 我想将所有以“Column21…T”开头的列写入名为First的数据集,将所有以“Column22…T”开头的列写入名为Second的数据集,以此类推 我希望保留转置表的第一列和第二列,因为它们包含描述行 我无法使用选择列1、列2。。。。Column454,因为列数太多 我该怎么做 (@Mod:谢谢你的清理:) 编辑,一张图片来说明一切:

我想按列名拆分一个PROC-SQL中有许多(454)列的表(可能使用宏?)

例如:一列以“Column21….T”、“Column22….T”开头,等等

  • 我想将所有以“Column21…T”开头的列写入名为First的数据集,将所有以“Column22…T”开头的列写入名为Second的数据集,以此类推

  • 我希望保留转置表的第一列和第二列,因为它们包含描述行

  • 我无法使用选择列1、列2。。。。Column454,因为列数太多

我该怎么做

(@Mod:谢谢你的清理:)

编辑,一张图片来说明一切:


您可以使用
后缀来创建变量列表

data first ;
  set have ;
  keep id1 id2 column21: ;
run;

data second ;
  set have ;
  keep id1 id2 column22: ;
run;
更新了相关的更多细节

那么,为什么不把每个组分别转置呢?制作一个宏以转换
Vx
的一个值

%macro split(value);
PROC TRANSPOSE DATA=work.stat2
  OUT=WORK.Column&value (LABEL="Transposed Vx=&value")
  PREFIX=Column
  LET
  NAME=Source
  LABEL=Label
;
  BY G;
  WHERE Vx=&value ;
  ID Vx;
  IDLABEL Vy;
  VAR A_ B_ C_ D_;
RUN;
%mend split ;
然后对Vx的每个值调用一次

proc sort data=work.stat2(keep=Vx) nodupkey out=Vx_list ;
  by Vx ;
run;
data _null_;
  set Vx_list;
  call execute(cats('%nrstr(%split)(',Vx,')'));
run;
宏程序:

%macro split(data,outdata);
    %do i=21 %to 121;
        data &outdata.&i;
            set &data;
               keep id1 id2 col&i:;
            run;
     %end;
%mend;

为什么不直接生成您想要开始的表,而不是生成一个巨大的表,然后将其拆分?您能否显示
proc transpose
步骤?这个表有多少行?关于
您希望有多少个目标数据集?将
首先
包含第21*T列、第210*T列、。。。专栏219*T?谢谢你们的帮助@汤姆:我需要一张大桌子,因为它是由两张大桌子连在一起的。如果我不这样做,我就不能一步转置。所以我真的需要一张巨大的桌子。[现场]理查德:请看我在作品中所附的照片。我能理解面具的必要性。您能否显示用于生成等效的预转置数据表的代码,以及用于创建454列输出表的proc转置语句。如果转置后的表有很多行,您可能不想将表切分为垂直切片,您可以编写一个宏,为可能进一步分析的每个片段生成一个
keep=
option子句。如果您想要一个算法,那么您需要更清楚地描述输入和输出数据结构。此外,对更大的问题进行更全面的描述可能会带来更简单的解决方案。实际上,您的解决方案只适用于那些事先知道列组的情况。因此,只有当一个人知道你想要分组的每个列的组名时。它可以工作,但当列之间的差异太大时,它会花费很多时间。假设有100组:Column21xxxxT、Column22xxxT、Column23xxxT。。。第49xxxt列。那你怎么做呢?输出必须按列分组。。。因此,如果有100个组,我需要100个数据集:(…?数据优先;直到数据100;左右…如果您想自动化此过程,您可以根据
sashelp.vcolumn
或proc-sql变体
dictionary.columns
。columns
。Suppa:一旦您超过N个数据集的个人痛苦阈值(我的大约是7个),为每组列编写一个宏并调用一次使用原始分类形式的数据不是更好吗?如果使用将100个列集拆分为100个数据集的数据,则不必对每个部分进行不同的命名(第一、第二、第三、…第九、第一百)然后简单地将数据集命名为piece1到piece100。然后您将看到,计件基础只是保留的列,因此您可能不需要100个数据集,而是
上的100个操作将
限制为属于第i列集的列。Suppa:如果列名为相同?因此,您需要更多的宏来重命名为公共基础,如果不是的话,您将得到一个&-填充的解决方案,该解决方案可能有效但更难理解。您可能会得到更有用的答案,显示更多的问题情况。@SuppaDuppa如果您想要一个算法解决方案,您需要提供更多信息。前缀
Column21 etc的来源?您是否已经在一个简单的数据集中拥有它们?如果是这样,请使用该数据集生成上述数据步骤。这不会起作用,因为我的列不会因此起作用。因此我的意思是,它不总是Column22001T、Column22002T等。它也可以是:Column22GH2T。或者根本没有意义的东西。:)根据您的描述,您希望将以相同数字开头的列保留在相同的数据中,例如col21ghT、col21asT保留在相同的数据中。如果没有,则提供虚拟数据来解释您希望执行的操作会有所帮助。
%macro split(data,outdata);
    %do i=21 %to 121;
        data &outdata.&i;
            set &data;
               keep id1 id2 col&i:;
            run;
     %end;
%mend;