【问题标题】:SAS, split the data by char levelsSAS,按字符级别拆分数据
【发布时间】:2018-04-17 22:46:23
【问题描述】:

我有一个数据集 (test1),我想将它分成两个或多个数据集。 第一列是序列的重复,第二列是不同级别的var(可以是2、3、4或更多)。我需要做的是自动(所以如果 var2 = a 不起作用)按第二列的级别拆分数据。我这个自动化是第二个变量的原因不同,有时它有 3 个级别,有时有 2 个,所以我不能使用 fix 语句。谢谢你。

data test1;
input var1$ var2$ ;
datalines;

1 a 
2 a 
3 a 
1 b 
2 b 


;
run;

data test1_output1;
input var1$ var2$ ;
datalines;

1 a 
2 a 
3 a 
;
run;


data test1_output2;
input var1$ var2$ ;
datalines;

1 b 
2 b 

;
run;

【问题讨论】:

  • 你需要解释你想要做什么。还显示您尝试过的代码。输入和期望输出的示例。
  • 本周早些时候已经问过:stackoverflow.com/questions/49805173/… 否则,请检查那里的 cmets 中演示几种动态方法的链接。
  • 和往常一样,通常会被忽略,这不是一个好的开始做法,而且通常会增加下游的工作量。
  • 请不要拆分数据。 SAS 具有非常适合的功能,例如WHERE 语句或WHERE= 数据集选项和BY 语句用于分组处理。

标签: sas


【解决方案1】:

调用执行很容易,假设您的数据已经排序。

data _null_;
    set test1;
    by var2;
    if first.var2 then call execute(
       'data data_'||strip(var2)||';
           set test1;
           where var2="'||strip(var2)||'";
        run;');
run;

编辑:

data _null_;
    set test1;
    by var2;
    if first.var2 then do;
        n+1;
         call execute(
       'data data_'||strip(n)||';
           set test1;
           where var2="'||strip(var2)||'";
        run;');
    end;
run;

【讨论】:

  • 它有效,谢谢!对于最终生成的数据,是否可以将其命名为 data_1、data_2、data_3、...而不是 data_var2,因为我需要使用输出进行一些下游分析。或者你有解决办法吗?例如。数据_新1;设置data_a;运行;数据_新1;设置数据_b;运行;
  • 它适用于测试数据,但不适用于我的真实数据。在我的真实数据集中,我已经有一个名为 n 的变量。输出数据名称变为data_7、data_16、data_512等(7,16是输出数据的原始n值)
  • 使用_n_ 而不是n
【解决方案2】:

如果您的数据集可以排序,即它具有唯一且不同的级别,请遵循以下 sn-p。这是一个不是很短的脚本,但在我的情况下可以完成这项工作。

先决条件(和宏变量)

proc sql noprint;
select distinct var2 into:var2s separated by ','
from work.test1
order by 1;
quit;

实际拆分器

%macro dssplit;
%do i = 1 %to %sysfunc(countw(%superq(var2s)));

%let varsplit = %sysfunc(strip(%scan(%superq(var2s), &i, %str(,)))); *making sure to get rid of erroneous spaces;

proc sql;
create table testsplit&i._%sysfunc(compress(&varsplit.)) as 
select * from work.test1
where var2 = "&varsplit.";
quit;

%end;

%mend dssplit; %dssplit;

在您的情况下,这将创建名称为 testsplit1_atestsplit2_b 的数据集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2013-07-19
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多