2016-10-04 2 views
0

Я пытался сделать что-то очень простое в R в SAS. В принципе, у меня есть таблица с 2n столбцами и одной строкой. Я хотел бы иметь таблицу с n столбцы и две строки.SAS, эквивалентный R Vector-to-Matrix

Это в основном то, что я пытаюсь сделать, в 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 и т. Д. - другими словами, я хочу перейти от этого набора данных из одной строки (x в примере R выше) к двухстрочному dataset (y в примере R выше). Мне что-то не хватает?

Спасибо!

+1

Возможно, вам нужно проверить 'shape' с' IML' – akrun

+1

'shape' с' IML'! Спасибо. – 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). Во-первых, создать еще один столбец говорят rowNum с помощью ceil() или floor():

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

После этого вы можете использовать прок транспонировать в нужной форме.

0

Для тех, кто без 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-специфическое поведение.