【问题标题】:How to get SAS tabulate output into Excel file如何将 SAS 表格输出转换为 Excel 文件
【发布时间】:2018-10-03 21:18:08
【问题描述】:

假设我有这个 MWE 数据:

data v;
input var1 $ var2 var3 $;
datalines;
cat 3 yes
sheep 2 no
sheep 3 maybe
pig 3 maybe
goat 3 maybe
cat 2 no
pig 1 no
cat 2 no
pig 1 no
goat 3 no
cat 3 no
cat 2 yes
cat 1 yes
sheep 3 no 
cat 2 no
cat 1 maybe
;
run;

我使用 proc tabulate 来计算每个值的观察次数。我对每个变量都这样做:

proc tabulate data=v;
    class var1;
    table (var1='' all="Total"),(N pctn);
quit;   


proc tabulate data=v;
    class var2;
    table (var2='' all="Total"),(N pctn);
quit;

proc tabulate data=v;
    class var3;
    table (var3='' all="Total"),(N pctn);
quit;

我得到如下输出:

       N        PctN
cat    8        50.00
goat   2        12.50
pig    3        18.75
sheep  3        18.75
Total  16       100.00

        N       PctN
1       4       25.00
2       5       31.25
3       7       43.75
Total   16      100.00

        N       PctN
maybe   4       25.00
no      9       56.25
yes     3       18.75
Total   16      100.00

我的问题是: 如何以以下格式将其导出到 Excel 中?:

Name    Cat 1   N1  N1% Cat 2   N2  N2%     Cat 3   N3  N3%     Cat 4   N4  N4%     Missing %   Total   Total%
var1    cat     8   50  goat    2   12.5    pig     3   18.75   sheep   3   18.75   0           16      100
var2    1       4   25  2       5   31.25   3       7   43.75                       0           16      100
var3    maybe   4   25  no      9   56.25   yes     3   18.75                       0           16      100

换句话说,我希望每个不同的变量都有自己的行。变量的每个值都将出现在这一行中,其中包含观察次数和总观察次数的百分比。最后三列是额外的,但不是必需的:缺失观察的百分比和数量以及变量值的总数。我该怎么做?

请注意,我是 SAS 的新手。也欢迎对代码进行任何改进,例如如何循环或压缩代码以生成表格。

【问题讨论】:

  • 这是一个糟糕的结构,原因有很多,你找不到简单的方法。对于单个表,我建议您向下而不是交叉,您可以使用单个 PROC FREQ 来获取数据。由于 all 列似乎毫无意义,不知道为什么要包括在内。如果您想丢失,proc freq 将使用 missing 选项来支持它。如果您对此感兴趣,请告诉我,我会发布代码。
  • 如果你真的需要这个结构,可以使用我的方法,转置数据。
  • 遇到超过4个类别的变量怎么办?你试过什么了?导出到 excel 很简单,但是将数据转换成您想要的形状需要大量的转置和附加。
  • 如果有四个以上的类别,我会想要更多的列。总列可以排在第一位是没有问题的。我还没有真正尝试过任何东西。

标签: excel sas export export-to-excel summary


【解决方案1】:

随着变量数量和不同值数量的增加,所需的数据形式非常混乱且难以使用。

可以执行这些处理步骤来实现输出结构:

  1. 转置每一行
  2. 获取每个变量值组合的频率计数
  3. 按变量扫描计数并为下一步构建名称/值对的数据集。根据需要为缺失的案例注入一行。
  4. 将名称/值对转换为宽结构
  5. 根据需要导出

示例

数据有第四个变量,它有一些缺失值。

data have;
input var1 $ var2 var3 $ var4;
datalines;
cat 3 yes .
sheep 2 no .
sheep 3 maybe .
pig 3 maybe .
goat 3 maybe 1 
cat 2 no 1
pig 1 no 1
cat 2 no 1
pig 1 no 1
goat 3 no 1
cat 3 no 1
cat 2 yes 1
cat 1 yes 1
sheep 3 no 1
cat 2 no 2
cat 1 maybe 1
;
run;

options missing = ' ';
proc transpose data=have_v out=vector1(index=(_name_));
  by rowid;
  var var1 var2 var3 var4;
run;

proc freq noprint data=vector1;
  by _name_;
  table col1 / missing out=freqs;
run;
options missing = '.';

data freqs_0;
  set freqs;
  by _name_;

  retain nomiss;
  if first._name_ then nomiss = not missing(col1);

  if first._name_ then seq=1; else seq+1;

  seqc = cats(seq);

  if first._name_ and missing(col1) then do;
    seqc = 'missing';
    seq = 0;
  end;

  length widename $32;

  if seqc ne 'missing' then do;
    widename = cats("cat_",seqc);
    widevalue = col1;
    output;
  end;

  widename = cats("cat_",seqc,'_COUNT');
  widevalue = COUNT;
  output;

  widename = cats("cat_",seqc,'_PERCENT');
  widevalue = PERCENT;
  output;

  if last._name_ and nomiss then do;
    seqc = 'missing';

    widename = cats("cat_",seqc,'_COUNT');
    widevalue = 0;
    output;

    widename = cats("cat_",seqc,'_PERCENT');
    widevalue = 0;
    output;

  end;
  keep _name_ widename widevalue;
run;

proc transpose data=freqs_0 out=wide;
  by _name_;
  id widename;
  var widevalue;
run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-03
    • 2018-01-17
    • 2013-10-05
    • 2019-11-20
    • 2017-04-02
    • 1970-01-01
    • 2013-05-04
    • 2020-06-13
    相关资源
    最近更新 更多