推 fishouse:非常感謝!! 03/05 22:05
※ 引述《fishouse (new hand)》之銘言:
: proc iml;
: a={1,2,3}; b={3,4,5}; c=2#(a+b);
: d={30,45,60};
: do until (2#c>d);
: c=c+1;
: end;
: print a b c d; end;
: -----------------------------------------------------
: 我想跑出的表格是像下面這樣
: a b c d
: 1 3 16 30
: 2 4 23 45
: 3 5 31 60
: 但若按照我上面的程式碼下去跑會變成
: a b c d
: 1 3 23 30
: 2 4 27 45
: 3 5 31 60
: 只有第三列是我想表達的意思,第一列跟第二列的c值都跑掉了。
: --------------------------------------------------------
: 新手第一次接觸sas,煩請各位統計先進能指點迷津,謝謝。
看得出來SAS是以所有c的元素都大於d的元素才停止do的動作
而 c=c+1; 是每一個元素都 +1 自然會有某幾列超過你的要求
我使用兩個迴圈來解決,不過不是很優的寫法
迴圈數如果太多,會使運算時間大幅上升
不過如果只要處理幾十個幾百個,應該還感覺不出來
proc iml;
a={1,2,3}; b={3,4,5}; c=2#(a+b); d={30,45,60};
n=nrow(a);
do i=1 to n;
do until (2#c[i]>d[i]);
c[i]=c[i]+1;
end;
end;
print a b c d;
quit;
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.172.238.133