我有一个关于在不使用PROC Transpose的情况下转置数据的问题。
0 a b c
1 dog cat camel
2 9 7 2534
如果不使用PROC TRANSPOSE,我如何获得结果数据集:
Animals Weight
1 dog 9
2 cat 7
3 camel 2534
答案 0 :(得分:3)
这是一个奇怪的要求。此示例代码是针对您的3个变量进行硬编码的。如果需要,你必须对此进行概括。
data temp;
input a $ b $ c $;
datalines;
dog cat camel
9 7 2534
;
run;
data animal_weight;
set temp end=last;
format animal animals1-animals3 $8.;
format weight weights1-weights3 best. ;
retain animals: weights:;
array animals[3];
array weights[3];
if _n_ = 1 then do;
animals[1] = a;
animals[2] = b;
animals[3] = c;
end;
else if _n_ = 2 then do;
weights[1] = input(a,best.);
weights[2] = input(b,best.);
weights[3] = input(c,best.);
end;
if last then do;
do i=1 to 3;
animal = animals[i];
weight = weights[i];
output;
end;
end;
drop i animals: weights: a b c;
run;
将值读入2个数组,将权重从字符串转换为数字。使用_N_
变量确定要填充的数组。在数据集的末尾,输出数组中的值。
答案 1 :(得分:0)
我不会把这作为家庭作业问题的答案,我实际上想要获得好成绩(因为它太先进了,所以很明显你要求帮助);但哈希解决方案几乎肯定是最灵活的,我希望有人在现实世界中这样做(假设有一个'不使用proc转置'的现实世界的原因,如可用的资源)。问题有些不确定,所以这只是中度容错。
data have;
input a $ b $ c $;
datalines;
dog cat camel
9 7 2534
;;;;
run;
data _null_;
set have end=eof;
array charvars _character_;
if _n_ = 1 then do;
length animal $15 weight 8;
declare hash h();
h.defineKey('row');
h.defineData('animal','weight');
h.defineDone();
end;
animal=' ';
weight=.;
do row = 1 to dim(charvars);
rc_f = h.find();
if rc_f ne 0 then do;
animal=charvars[row];
rc_a = h.add();
animal=' ';
end;
else if rc_f eq 0 then do;
weight=input(charvars[row],best12.);
rc_r = h.replace();
end;
end;
if eof then rc_o = h.output(dataset:'want');
run;
答案 2 :(得分:0)
你总是只有两行,或者列和行是否是动态的?
如果你有动态的行和列,那么理想的方法是使用open函数,将no的列添加到宏变量中。这将是新数据集中的行数。然后取原始数据集中的行数,该数据集将是新数据集中的列数。这必须在实际的Transpose方法之前发生。发布此内容后,您可以将其读入数组,并使用宏变量作为维度将值输出到新数据集中。
说完这一切之后,当你已经拥有SAS提供的现成转置功能时,为什么还要重新发明轮子?