2016-10-04 17 views
0

私はSASのRで非常に簡単なことをしようとしてきました。基本的には、2nの列と1行の表があります。 nの列と2つの行を持つテーブルを用意したいと思います。SASと同等のRベクトル - マトリックス

これは私が、Rに何をしようとしている基本的には次のとおりです。

> x 
[1] 1 2 3 4 5 6 7 8 9 10 

へ:から私たちを取る

x <- c(1:10) 

y <- matrix(x, nrow = 2, ncol = 5, byrow = T) 

SASでそう

> y 

    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 2 3 4 5 
[2,] 6 7 8 9 10 

を、私は次の例のデータセットを持っているとしましょう:

data test; 
    input v1 v2 v3 v4 v5 e_v1 e_v2 e_v3 e_v4 e_v5; 
    datalines; 
1 2 3 4 5 6 7 8 9 10 
; 
run; 

私は、e_v1が実際にv1などの2行目であるようにしようとしています。つまり、この1行のデータセット(上記のRの例ではx)から2行データセット(上記のRの例ではy)。私は明白な何かを欠いていますか

ありがとうございました!

+1

'IML'の' shape'を 'IML'の' shape'をチェックする必要があるかもしれません。 – akrun

+1

'shape'ありがとうございました。 – cpander

+0

将来、Base SASまたはIMLを使用しているかどうかを指定してください:) – Reeza

答えて

2

これはあなたの例の解決策です。 SAS IMLなししかしPROC FCMPへのアクセス権を持つ人のために

data tworow; 
    set test(keep=v:) test(keep=e: rename=(e_v1-e_v5=v1-v5)); 
    run; 
+0

これは明白であったはずです。ありがとうございました。 – cpander

1

proc transposeが必要です(ベースSAS)。まず、別の列を作成ceil()floor()を使用してrowNumを言う:この後

data foo; 
set test; 
rowNum = floor(_N_,5); 
run; 

ご希望の形式でのproc転置を使用することができます。

0

/* This data is just for my example, see question for WORK.TEST */ 
DATA test2; 
    Array x [16]; 
    Do i = 1 to 16; 
     x[i] = i; 
    End; 
    Drop i; 
Run; 

PROC FCMP; 
    /* 
    SAS equivalent of R's matrix(x, nrow) function. To get the effect of R's 
    "byrow" argument, use PROC TRANSPOSE. 

    Arguments 
     indata: Character value naming the input data set 
     outdata: Character value naming the output data set 
     nrow: Desired number of rows in the output 
    */ 
    Subroutine row_to_table(indata $, outdata $, nrow); 
     Array in_values [1, 1]/nosymbols; 
     Array out_values [1, 1]/nosymbols; 

     rc = read_array(indata, in_values); 

     in_length = dim1(in_values) * dim2(in_values); 
     ncol = ceilz(in_length/nrow); 
     Call dynamic_array(out_values, nrow, ncol); 

     out_row = 1; 
     out_col = 1; 
     Do in_row = 1 to dim1(in_values); 
      Do in_col = 1 to dim2(in_values) while (out_row <= dim1(out_values)); 
       out_values[out_row, out_col] = in_values[in_row, in_col]; 
       If out_col = dim2(out_values) then do; 
        out_row = out_row + 1; 
        out_col = 1; 
       End; 
       Else out_col = out_col + 1; 
      End; 
     End; 

     rc = write_array(outdata, out_values); 
    Endsub; 

    /* Original example */ 
    Call row_to_table('test', 'result1', 2); 
    /* 16 items to 3 rows: should add missing values as filler */ 
    Call row_to_table('test2', 'result2', 3); 
Run; 

結果1:

Obs v1 v2 v3 v4 v5 

1  1  2  3  4  5 
2  6  7  8  9 10 

結果2:

Obs v1 v2 v3 v4 v5 v6 

1  1  2  3  4  5  6 
2  7  8  9 10 11 12 
3  13 14 15 16  .  . 

これは完璧ではありませんRはベクトルをリサイクルして記入するので、レクリエーション"余分な"行列要素ですが、それは非常にR固有の動作です。