SAS Transpose不使用PROC Transpose

时间:2013-12-08 00:05:31

标签: sas

我有一个关于在不使用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

3 个答案:

答案 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提供的现成转置功能时,为什么还要重新发明轮子?