我希望这条消息能很好地找到你。我是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;