我一直在努力做一些在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例子中)。我错过了一些明显的东西吗?
谢谢!
答案 0 :(得分:2)
这是您的示例的解决方案。
data tworow;
set test(keep=v:) test(keep=e: rename=(e_v1-e_v5=v1-v5));
run;
答案 1 :(得分:1)
您需要proc transpose
(在基本SAS中)。首先使用rowNum
或ceil()
创建另一列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的行为。