2012-03-08 6 views
0

私は、ft値に応じて可変列の変数を再配置したいと考えています。 ft = 1ならば、o2とo5 @ 33と34を入れてください。もしft = 2なら、o2とo5 @ 35と36などを入れてください...しかし、以下のループと配列が正しくないと思います。誰かが私が間違ったことを指摘できますか?SAS:列の位置の並べ替え

data fttry1; 
input ft m1 o2 m3 m4 o5; 
datalines; 
1 2 3 4 5 6 
2 7 8 9 10 11 
3 12 13 14 15 20 
4 16 17 18 19 21 
; 
run; 

data fttry2; 
set fttry1; 
file print notitles; 
put @10 ft 
     @30 M1 
     @31 M3-M4; 
do ft =1 to 4; 
    array ftposition[2] o2 o5; 
    do i=1 to 2; 
    do l=33 to 34 by 2; 
    put @l ftposition[i]; 
    end; 
    end; 
end; 
run; 
+0

あなたは、第3および第4の行に対して、ここでコード化されたものを2桁のnumber.Likeに対処する方法を不明確である、M1、M3、M4が位置が重なって発生しますすべて2桁の数字であり、出力で。 –

+0

私はその問題については考えていませんでした。しかし、上記の主な問題は、o2とo5が他の変数と同じ行にとどまらないことです。多分、これはあなたが教えたことに関連しているのかもしれません。知りません。私は2のようなステートメントを置いた後に数字を修正しようとすることができます。 – user634455

+0

処理したいデータセット全体がここでの例のように単純な場合(2つの変数のみが位置調整が必要です)、解決策は非常に簡単です。 –

答えて

0

これは機能しますか?

data fttry1; 
input ft m1 o2 m3 m4 o5; 
datalines; 
1 2 3 4 5 6 
2 7 8 9 10 11 
3 12 13 14 15 20 
4 16 17 18 19 21 
; 
run; 

data fttry2; 
set fttry1; 
file print notitles; 
cnt + 1; 
put @10 ft 
     @30 M1 
     @31 M3-M4 @; 
    o2_loc=(ft+cnt) + 32; 
    o5_loc=(ft+cnt) + 33; 
put @o2_loc o2 @; 
put @o5_loc o5 ; 
run; 

EDIT Thisリンクは末尾に@記号は、PUT文の後に改行を防ぐことができますことを示しています。

+0

はo2とo5を動作させていないようです。 m1〜m4と同じ行にはありません。 – user634455

0

コメントに記載したとおり、2桁の数字は問題があります。だから私は出力のためにm3、m4を含まない。それはシリアル番号のようなものなので、 "ft"はポインタとして使用します(それは?)。 o2の長さを取得して、o2とo5の間に重複がないことを確認します。

data fttry1; 
input ft m1 o2 m3 m4 o5; 
datalines; 
1 2 3 4 5 6 
2 7 8 9 10 11 
3 12 13 14 15 20 
4 16 17 18 19 21 
; 
run; 

data fttry2; 
set fttry1; 
file print notitles; 
by ft; 
    put @10 ft 
     @30 M1 
     @(31+2*ft) o2 
     @(31+2*ft+length(cats(o2))) o5; 
run; 
+0

華麗なRobbie!このような良い解決策と洞察力で、これを別の方法で見てくれてありがとう!ところで、 – user634455

+0

、なぜ私のループがうまくいかなかったと思いますか? – user634455

+0

"i"ループ(2インスタンス)は元のデータセットの1行ごとに対応する2行を作成します。 btw、あなたが受け入れる答えを選んでください。 –

関連する問題