【问题标题】:How to count based on value in observation in SAS如何根据 SAS 中的观察值进行计数
【发布时间】:2021-03-24 23:11:08
【问题描述】:

我希望这封邮件能帮助您。我对 SAS 编程非常陌生,我正在尝试创建一些代码来计算多列中唯一条目的数量以进行多次观察。我也有一些我想忽略的专栏。下面是一个示例数据集:

|ID |   Var1   |   NotNeededVar2   |   Var3   |   Var4   |   Var5   |
| 1 | String1  |  StringSomething  |  String2 |  String3 |  String3 |
| 2 | String1  |  StringSomething  |  String2 |  String1 |  String2 |
| 3 | String1  |  StringSomething  |  String1 |  String1 |  String1 |
| 4 | String1  |  StringSomething  |     .    |  String2 |  String2 |

期望的结果是一个新数据集,其中包含一个新添加的列,其中包含第 1、3、4 和 5 列的唯一条目计数:

|ID |   Var1   |   NotNeededVar2   |   Var3   |   Var4   |   Var5   | Unique(Var1, 3, 4, 5) |
| 1 | String1  |  StringSomething  |  String2 |  String3 |  String3 |        3           |
| 2 | String1  |  StringSomething  |  String2 |  String1 |  String2 |        2           |
| 3 | String1  |  StringSomething  |  String1 |  String1 |  String1 |        1           |
| 4 | String1  |  StringSomething  |     .    |  String2 |  String2 |        2           |

到目前为止,我所能想到的只是使用多个 if/then 语句来测试列是否唯一且没有丢失,但这似乎是一种肯定会犯一些错误并使其变得非常复杂的方法。

我们将不胜感激任何和所有的帮助!

编辑:更改示例以反映字符串/字符值而不是数值。不知道有没有影响,不过这个更接近我的实际情况。

EDIT2:插入不需要的列以更好地反映我的数据集。

【问题讨论】:

  • 你只有三列吗?会扩大吗?
  • 我确实有更多的专栏。我总共要考虑四列。我也有一些我想忽略的专栏,我现在才意识到这可能会使它变得更加困难。我已经更新了示例。
  • 为什么不直接转置数据呢?然后使用count(distinct var) 进行简单的sql 查询就可以了。

标签: sas


【解决方案1】:

您可以使用 WHICHC() 函数来检查当前值是否出现在列表的前面。

data have ;
  input ID (Var1 NotNeededVar2 Var3 Var4 Var5) (:$20.);
cards;
1 String1 StringSomething String2 String3 String3  
2 String1 StringSomething String2 String1 String2  
3 String1 StringSomething String1 String1 String1  
4 String1 StringSomething    .    String2 String2  
5 . . . . .
;

data want;
  set have;
  array list var1 var3-var5 ;
  count=0;
  do index=1 to dim(list);
   if not missing(list[index]) and whichc(list[index],of list[*])=index then count+1;
  end;
  drop index;
run;

结果

Obs    ID     Var1       NotNeededVar2      Var3       Var4       Var5      count

 1      1    String1    StringSomething    String2    String3    String3      3
 2      2    String1    StringSomething    String2    String1    String2      2
 3      3    String1    StringSomething    String1    String1    String1      1
 4      4    String1    StringSomething               String2    String2      2
 5      5                                                                     0

【讨论】:

  • 这成功了!非常感谢。我显然需要更多地了解数组,因为建议的答案都是基于此。
【解决方案2】:

我将假设变量的顺序并不重要。如果是,则需要先将它们复制到不同的数组中,然后对其进行排序。

data want;
set have;

array _myvars(*) var1 var3 var4 var5;

*sorts arrays values alphabetically - you may not want this step;
call sortc(of _myvars(*));

count = 0;

do i=2 to dim(_myvars);
    if _myvars(i) ne _myvars(i-1) then count+1;
end;

run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多