我有一个表格,其中包含一个客户列,后面是多列(与商店相关)和一个标志,表明他们是否访问了这家商店,如果他们没有,则该单元格为空。商店按重要性排列,Shop1最高,shop2,shop3等等。说明顾客是否访问过该特定商店的标志是与商店号码相关的号码。因此,例如,如果客户没有访问过shop1,那么这将是空白的,但如果他们访问了shop2,则此单元格将为' 2'
我需要将列合并在一起,以创建一个表,每个客户都有他们访问过的前4个商店,例如,客户的条目可以读取第一列' 2',第二列栏目' 5',第三栏' 7',第四栏' 8'因为他们没有访问过1,3,4或6号商店。有人可以帮忙吗?谢谢。
答案 0 :(得分:0)
我认为这就是你要找的东西。获取输入数据(我假设你的意思),执行转置,过滤丢失的(null)值,然后重新转置。
data input;
input customer $ shop01 shop02 shop03 shop04;
datalines;
Bill 1 2 . .
Ted . 2 3 .
;
proc sort data=input;
by customer;
run;
proc transpose data=input out=temp(where=(col1 ^= .) drop=_name_);
by customer;
run;
proc transpose data=temp out=output(drop=_name_);
by customer;
run;
这给了我:
Bill 1 2
Ted 2 3
答案 1 :(得分:0)
考虑到数据的布局方式,您可以将smallest
函数与变量列表一起使用,以返回商店变量中第一个最小的非缺失值,第二个最小,依此类推。
data test(drop=shop01-shop08);
set input;
first = smallest(1,of shop01-shop08);
second = smallest(2,of shop01-shop08);
third = smallest(3,of shop01-shop08);
fourth = smallest(4,of shop01-shop08);
run;