如何在SAS中根据观察值进行计数

  • 本文关键字:观察 SAS sas
  • 更新时间 :
  • 英文 :


我希望这条消息能很好地找到你。我是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语句来测试列是否是唯一的并且没有丢失,但这似乎是一种肯定会出错并使其变得非常复杂的方法。

任何帮助都将不胜感激!

EDIT:更改示例以反映字符串/字符值,而不是数值。不确定这是否有影响,但这更接近我的实际情况。

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

您可以使用WHICH((函数来检查当前值是否出现在列表的早期。

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

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

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;

最新更新