【问题标题】:Merge macro tables in SAS在 SAS 中合并宏表
【发布时间】:2019-05-01 20:08:01
【问题描述】:

我是 SAS 的初学者,所以我不熟悉语法。我有两个使用宏创建的数据集。 (宏:https://gist.github.com/statgeek/2f27939fd72d1dd7d8c8669cd39d7e67

DATA test1; 
     set sashelp.class;
     if prxmatch('m/M/oi', sex);
     female=ifn( sex='F',1,0);
RUN; 

%table_char(test1, height weight age, sex, female, test1_table_char); 

DATA test2; 
     set sashelp.class;
     if prxmatch('m/F/oi', sex);
     female=ifn( sex='F',1,0);
RUN; 

%table_char(test2, height weight age, sex, female, test2_table_char);

期望的输出:

               Male       Female 
Height 
  Count 
  Mean
  Median
   .
   .
Weight
Count 
  Mean
  Median
   .
   .
Sex
  M
  F
Etc

我想将使用 %table_char 按名称创建的两个宏表合并在一起。我应该如何调用这两个表以便合并?

DATA final_merge; 
     merge test1_table_char   test2_table_char;
     by NAME;
RUN;

【问题讨论】:

  • 你的最终目标是什么。这里的场景似乎不需要宏
  • 我想合并 NAME 为 test1 和 test2 创建的表。我不需要宏来合并,但我不知道如何合并表格。
  • 您能否提供一些可以显示预期输出的示例数据?
  • 您是否创建了您正在调用的宏?你知道它生成的数据集是如何格式化的吗?您需要先了解这一点,然后才能知道如何将其中两个放在一起。
  • 我没有创建链接中的宏。我知道它生成的数据集在单列人口统计表中格式化。由于我是初学者,我真的不知道如何编辑宏以包含多个组。相反,我只是创建多个同一个表并将它们合并在一起以获得我需要的东西(上面发布)。

标签: merge macros sas


【解决方案1】:

看起来你需要做的是追加数据集。

 data final;
   set test1 test2;
 run;

你不需要拆分和合并数据集,你可以简单地做。

  DATA final; 
 set sashelp.class;
 female=ifn( sex='F',1,0);
RUN;

如果你想合并数据集,然后合并数据集

 proc sort data =test1;
 by your_variable;
  run;

 proc sort data =test2;
 by your_variable;
  run;

  data final;
  merge test1 test2
   by your_variable;
  run;

【讨论】:

  • 感谢您的回复。以上是我想要完成的示例,因此我仍然想使用拆分和合并方法,因为我想保留其他详细信息:gist.github.com/statgeek/2f27939fd72d1dd7d8c8669cd39d7e67
  • 这意味着你需要追加数据而不是合并
  • 那么如果我想合并 test1_table_char 和 test2_table_char 就足够了吗?
  • 当您说合并时,您的意思是希望两个数据集并排对齐,还是希望它们堆叠在一起?
  • 并排。 github 链接应该给出我使用的宏,sashelp.class 应该给出示例数据。
【解决方案2】:

按名称合并或合并 test1 和 test2:

proc sort data=work.test1;                                                                                                                                                                                                                                      
   by name;                                                                                                                                                                                                                                                     
run;                                                                                                                                                                                                                                                            

proc sort data=work.test2;                                                                                                                                                                                                                                      
   by name;                                                                                                                                                                                                                                                     
run;                                                                                                                                                                                                                                                            

data work.test;                                                                                                                                                                                                                                                 
   merge work.test1 work.test2;                                                                                                                                                                                                                                 
   by name;                                                                                                                                                                                                                                                     
run; 

产生这个结果:

Name       Sex    Age    Height    Weight    female

Alfred      M      14     69.0      112.5       0
Alice       F      13     56.5       84.0       1
Barbara     F      13     65.3       98.0       1
Carol       F      14     62.8      102.5       1
Henry       M      14     63.5      102.5       0
James       M      12     57.3       83.0       0
Jane        F      12     59.8       84.5       1
Janet       F      15     62.5      112.5       1
Jeffrey     M      13     62.5       84.0       0
John        M      12     59.0       99.5       0
Joyce       F      11     51.3       50.5       1
Judy        F      14     64.3       90.0       1
Louise      F      12     56.3       77.0       1
Mary        F      15     66.5      112.0       1
Philip      M      16     72.0      150.0       0
Robert      M      12     64.8      128.0       0
Ronald      M      15     67.0      133.0       0
Thomas      M      11     57.5       85.0       0
William     M      15     66.5      112.0       0

使用合并的输出运行宏:

%table_char(test, height weight age, sex, female, test_table_char); 

产生以下结果:

categorical        value

Sex
F                      9(47.4%)
M                     10(52.6%)
Height
Count(Missing)     19(0)
Mean (SD)           62.3(5.1)
Median (IQR)        62.8(57.5 - 66.5
Range               51.3 - 72.0
90th Percentile     69.0
Weight
Count(Missing)     19(0)
Mean (SD)          100.0(22.8)
Median (IQR)        99.5(84.0 - 112.
Range               50.5 - 150.0
90th Percentile    133.0
Age
Count(Missing)     19(0)
Mean (SD)           13.3(1.5)
Median (IQR)        13.0(12.0 - 15.0
Range               11.0 - 16.0
90th Percentile     15.0
Female                 9(47.4%)

【讨论】:

  • 我正在尝试并排获取两个值列,并分别针对男性和女性进行统计
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 2019-12-24
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多