sas中具有不同维度的数组

sas中具有不同维度的数组,sas,Sas,从一张桌子开始 A B C D E 1 . 1 . 1 . . 1 . . . 1 . 1 . 我试图得到如下输出: A B C D E X Y Z 1 . 1 . 1 1 1 1 . . 1 . . 1 . 1 . 1 . 1 1 这是我的密码: data want; set have; array GG(5) A-E; array BB(3) X Y Z; do i=1 to 5; do j=1 to 3; if gg(i)=1 t

从一张桌子开始

A B C D E 
1 . 1 . 1
. . 1 . .
. 1 . 1 .
我试图得到如下输出:

A B C D E     X Y Z
1 . 1 . 1     1 1 1
. . 1 . .     1 
. 1 . 1 .     1 1
这是我的密码:

data want; 
set have; 

array GG(5) A-E; 
array BB(3) X Y Z;

do i=1 to 5;
do j=1 to 3;     
if gg(i)=1 then BB(j)=1; 
end; 
end; 
run;

我知道我得到的结果是错误的,因为两个阵列的尺寸不配合。还有别的办法吗

我的方法是将现有值复制到新变量X Y X temp1 temp2,然后使用
call sortn
对值进行排序,这将把1和缺少的值放在一起。因为
call sortn
只按升序排序,缺少的值排在第一位,所以我反转了array语句中的变量(使用
retain
语句以正确的顺序首先创建它们)

data want;
   set have;
   array v1 a--e;
   array v2 x y z;
   i=1;
   do over v1;
      if not missing(of v1) then do;
         v2(i)=v1;
         i+1;
      end;
   end;
   drop i;
run;
然后可以删除不需要的变量temp1和temp2

data have;
input A B C D E;
datalines;
1 . 1 . 1
. . 1 . .
. 1 . 1 .
;
run;

data want;
set have;
retain X Y Z .; /* create new variables in required order */
array GG{5} A--E;
array BB{5} temp1 temp2 Z Y X; /* array in reverse order due to ascending sort later on */
do i = 1 to dim(GG);
    BB{i} = GG{i};
end;
call sortn(of BB{*}); /* sort array (missing values come first, hence the reverse array order) */
drop temp: i; /* drop unwanted variables */
run;
或者,这里有一个更简单的解决方案,因为您的标准非常基本。由于您只处理1和缺失,您可以循环a-E中未缺失值的数量,并将1分配给新数组

data want;
set have;
array GG{5} A--E;
array BB{3} X Y Z;
do i = 1 to n(of GG{*});
    BB{i}=1;
end;
drop i; /* drop unwanted variable*/
run;

为什么不使用计数器来确定哪个位置是实际的非缺失值

data try;
   infile datalines delimiter=','; 
   input var1 var2 var3 var4 var5;
   datalines;                      
1,.,.,1,1,
.,1,.,.,.,
.,.,.,.,.,
.,1,.,1,.,
;
data want;
set try;
array vars[5] var1 var2 var3 var4 var5;
array newvars[5] nvar1 nvar2 nvar3 nvar4 nvar5;
do i=1 to 5;
if i=1 then count=0;
if vars[i] ne . then do;
count=count+1;
newvars[count]=vars[i];
end;
end;
drop i count var:;
run;

do over
已被弃用,因此您应该使用迭代器执行此操作,否则这是很好的。@shenglin Chen只有在X和Y Z中使用最后一个变量blank@Joe是的,最好进行一次迭代。以下是所需数据的解决方案;
code
set have;
code
ar射线v1 a--e;
code
array v2 x y z;
code
j=1;
code
do i=1到5;
code
如果没有丢失(v1(i)),则执行;
code
v2(j)=v1;
code
j=j+1;
code
end;
code
end;
code
drop i j;
code
run;
code
您能告诉我们x,y,z被分配为1的逻辑吗?@9一行中最多有3,1,这三个新变量将被接受。第一个1应该是十、 第二个是Y,第三个是Z