2016-10-04 4 views
0

나는 SAS에서 R에서 매우 쉬운 일을 해왔습니다. 기본적으로 나는 2n 컬럼과 하나의 행을 가진 테이블을 가지고 있습니다. n 개의 열과 두 개의 행이있는 표를 갖고 싶습니다.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 행이라는 것을 확인하려고한다. 즉,이 한 행 데이터 집합 (위의 R 예에서 x)에서 두 행 데이터 집합 (위의 R 예에서 y) 나는 명백한 것을 놓치고 있는가?

감사합니다.

+1

'IML'에서'shape'을 확인해야 할 수도 있습니다. – akrun

+1

'shape'이'IML'에서 작동했습니다! 고맙습니다. – 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

이 경우 기본 SAS에서 proc transpose이 필요합니다. 첫째로 다른 열이 ceil() 또는 floor()를 사용하여 rowNum 말을 만들 : 당신이 원하는 형태로 바꾸어 시저 사용할 수있는이 후

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

합니다.

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 

result2 :

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은 벡터를 재활용하기 때문에 레크리에이션 "extra"행렬 요소가 있지만 이는 매우 R 고유의 동작입니다.