2016-10-04 140 views
0

我一直在尝试做一些在SAS中R很容易做的事情。基本上,我有一个2n列和一行。我想有一个n列和两行的表格。SAS相当于R矢量到矩阵

这基本上就是我想要做的,在R:

x <- c(1:10) 

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

这需要我们从:

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

到:

> y 

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

所以在SAS,假设我有以下示例数据集:

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实际上是第二行的第二行等 - 换句话说,我想从这个一行数据集(上面的R例子中的x)转到两行数据集(y在上面的R例子中)。我错过了明显的东西吗?

谢谢!

+1

您可能需要检查'IML''形状''IML'的形状 – akrun

+1

'I''的形状'工作!谢谢。 – cpander

+0

将来请指定您是否使用Base SAS或IML :) – Reeza

回答

2

这是您的示例的解决方案。

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

对于那些没有SAS IML但进入PROC钙镁磷肥:

/* 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; 

RESULT1:

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回收一个向量来填补“额外”的矩阵元素,但这是一个非常特殊的行为。