Sas 如何使用特定系统设置数据

Sas 如何使用特定系统设置数据,sas,datastep,Sas,Datastep,我没什么问题。作为示例表HAVE1和HAVE2,我希望创建类似于want的表,在下面设置从HAVE2到all列的特定行数据(从COL1到COL19,没有COL20),并获得类似want的表。我该怎么办 data HAVE1; infile DATALINES dsd missover; input ID NAME $ COL1-COL20; CARDS; 1, A1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 1

我没什么问题。作为示例表HAVE1和HAVE2,我希望创建类似于want的表,在下面设置从HAVE2到all列的特定行数据(从COL1到COL19,没有COL20),并获得类似want的表。我该怎么办

data HAVE1;
infile DATALINES dsd missover;
input ID NAME $ COL1-COL20;
CARDS;
1, A1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ,20
2, A2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
3, B1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 20, 21 , 21, 22 
4, B2, 1, 20, 3, 20, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 23, 22, 23
5, C1, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 12, 13, 14, 15, 16, 17, 17, 17, 17
6, C2, 1, 2, 3, 20, 5, 6, 7, 8, 02, 10, 11, 12, 30, 14, 15, 16, 17, 18, 19, 20
;run;

Data HAVE2;
infile DATALINES dsd missover;
input ID NAME $ WARTOSC;
CARDS;
1, SUM, 50000
2, SUM, 55000
3, SUM, 60000
;run;

DATA WANT;
infile DATALINES dsd missover;
input ID NAME $ COL1-COL20;
CARDS;
1, A1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ,20
1, SUM_1    ,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000
2, A2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
2, SUM_2, 55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000
3, B1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 20, 21 , 21, 22 
3, SUM_3,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000
4, B2, 1, 20, 3, 20, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 23, 22, 23
5, C1, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 12, 13, 14, 15, 16, 17, 17, 17, 17
6, C2, 1, 2, 3, 20, 5, 6, 7, 8, 02, 10, 11, 12, 30, 14, 15, 16, 17, 18, 19, 20
;run;

您的
want
ed表非常独特,您最好生成一个报告,而不是一个数据集,您可以简单地
proc print

无论如何,对于have2,该步骤将需要转换名称并复制
wartosc

例如:

data want (drop=wartosc);
  set have1 end=end1;
  output;

  if not end2 then 
    set have2(rename=id=id2) end=end2;

  if id = id2 then do;
    array col col1-col20;
    do over col; col=wartosc; end;
    name = catx('_', name, id);
    output;
  end;

run;

如果出现
want2
的行数多于
want1
的情况,则可能需要更多的逻辑

您的
want
ed表非常独特,您最好生成一个报告,而不是一个数据集,您可以简单地
proc print

无论如何,对于have2,该步骤将需要转换名称并复制
wartosc

例如:

data want (drop=wartosc);
  set have1 end=end1;
  output;

  if not end2 then 
    set have2(rename=id=id2) end=end2;

  if id = id2 then do;
    array col col1-col20;
    do over col; col=wartosc; end;
    name = catx('_', name, id);
    output;
  end;

run;

如果出现
want2
的行数多于
want1
的情况,则可能需要更多的逻辑

因此,听起来您只需要重新格式化第二个数据集,以匹配所需内容,然后将它们合并。只需将WARTOSC的值复制到所有列并删除原始WARTOSC变量

data HAVE1;
  infile CARDS dsd truncover;
  input ID NAME $ COL1-COL5;
CARDS;
1, A1, 1, 2, 3, 4, 5
2, A2, 1, 2, 3, 4, 5
3, B1, 3, 4, 5, 6, 7
4, B2, 1, 20, 3, 20, 5
5, C1, 20, 2, 3, 4, 5
6, C2, 1, 2, 3, 20, 5
;

data HAVE2;
  infile CARDS dsd truncover;
  input ID NAME $ WARTOSC;
CARDS;
1, SUM, 50000
2, SUM, 55000
3, SUM, 60000
;

data have2_fixed;
  set have2;
  name=catx('_',name,id);
  array col col1-col5;
  do over col ; col=wartosc; end;
  drop wartosc;
run;

data want ;
  set have1 have2_fixed;
  by id;
run;
如果数据集很大,实际上可以在合并期间进行更改

data want ;
  set have1 have2 (in=in2);
  by id;
  array col col1-col5;
  if in2 then do;
    name=catx('_',name,id);
    do over col ; col=wartosc; end;
  end;
  drop wartosc;
run;
结果:

Obs    ID    NAME      COL1     COL2     COL3     COL4     COL5

 1      1    A1           1        2        3        4        5
 2      1    SUM_1    50000    50000    50000    50000    50000
 3      2    A2           1        2        3        4        5
 4      2    SUM_2    55000    55000    55000    55000    55000
 5      3    B1           3        4        5        6        7
 6      3    SUM_3    60000    60000    60000    60000    60000
 7      4    B2           1       20        3       20        5
 8      5    C1          20        2        3        4        5
 9      6    C2           1        2        3       20        5

因此,听起来您只需要重新格式化第二个数据集,以匹配所需内容,然后将它们合并。只需将WARTOSC的值复制到所有列并删除原始WARTOSC变量

data HAVE1;
  infile CARDS dsd truncover;
  input ID NAME $ COL1-COL5;
CARDS;
1, A1, 1, 2, 3, 4, 5
2, A2, 1, 2, 3, 4, 5
3, B1, 3, 4, 5, 6, 7
4, B2, 1, 20, 3, 20, 5
5, C1, 20, 2, 3, 4, 5
6, C2, 1, 2, 3, 20, 5
;

data HAVE2;
  infile CARDS dsd truncover;
  input ID NAME $ WARTOSC;
CARDS;
1, SUM, 50000
2, SUM, 55000
3, SUM, 60000
;

data have2_fixed;
  set have2;
  name=catx('_',name,id);
  array col col1-col5;
  do over col ; col=wartosc; end;
  drop wartosc;
run;

data want ;
  set have1 have2_fixed;
  by id;
run;
如果数据集很大,实际上可以在合并期间进行更改

data want ;
  set have1 have2 (in=in2);
  by id;
  array col col1-col5;
  if in2 then do;
    name=catx('_',name,id);
    do over col ; col=wartosc; end;
  end;
  drop wartosc;
run;
结果:

Obs    ID    NAME      COL1     COL2     COL3     COL4     COL5

 1      1    A1           1        2        3        4        5
 2      1    SUM_1    50000    50000    50000    50000    50000
 3      2    A2           1        2        3        4        5
 4      2    SUM_2    55000    55000    55000    55000    55000
 5      3    B1           3        4        5        6        7
 6      3    SUM_3    60000    60000    60000    60000    60000
 7      4    B2           1       20        3       20        5
 8      5    C1          20        2        3        4        5
 9      6    C2           1        2        3       20        5

您只是在寻找一个带有BY语句的SET语句,以便根据BY变量的值对两个数据集的值进行交错吗?您的意思是
data aa;设置HAVE1 HAVE2;按身份证;运行这不符合我的预期,请详细解释您试图创建的内容。您只想将WARTOSC的值复制20次吗?我想要数据want中的示例代码中的数据。我希望将数据从HAVE2插入HAVE1,并将字段WARTOSC(从HAVE2)中的值分散到HAVE1中的col1-col19,而不是仅将WARTOSC设置为HAVE1。@Tom,是的,从col1复制到19(没有20).您是否只是在寻找一个带有BY语句的SET语句,以便根据BY变量的值来交错两个数据集的值?您的意思是
data aa;设置HAVE1 HAVE2;按身份证;运行这不符合我的预期,请详细解释您试图创建的内容。您只想将WARTOSC的值复制20次吗?我想要数据want中的示例代码中的数据。我希望将数据从HAVE2插入HAVE1,并将字段WARTOSC(从HAVE2)中的值分散到HAVE1中的col1-col19,而不是仅将WARTOSC设置为HAVE1。@Tom,是的,从col1复制到19(没有20)。Richard,您的解决方案也非常有趣,谢谢!理查德,你的解决方案也很有意思,谢谢!