SAS相当于R矢量到矩阵

时间:2016-10-04 15:56:35

标签: r sas

我一直在努力做一些在SAS中很容易做到的事情。基本上,我有一个带有 2n 列和一行的表。我想要一个包含 n 列和两行的表。

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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您需要proc transpose(在基本SAS中)。首先使用rowNumceil()创建另一列floor()

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

在此之后,您可以使用所需形式的proc转置。

答案 2 :(得分:1)

对于那些没有SAS IML但可以访问PROC FCMP的人:

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