SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 702|回复: 3
打印 上一主题 下一主题

数据变换求助

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-10-19 17:33:59 | 只看该作者

数据变换求助

原数据集
             Obs    SYZGSXXT    DZZGSXXT    Frequency

                             1         1           1           27
                             2         1           4           27
                             3         4           1           27
                             4         4           4           27
转换为新数据集
SYZGSXXT dz1 dz2  dz3 dz4
1              27   0     0   27
2              0    0     0     0
3              0    0     0    0
4             27   0     0    27


说明:
(1)SYZGSXXT DZZGSXXT 的取值范围是 1-4,但在数据集里并不是1-4都有,就像上面显示的,只有1 和4,当然也可以是其他只有 1 2 或只有 2 3。
(2)现在想把DZZGSXXT 转化为列变量,zd1-zd4,zd1对应的是DZZGSXXT取值为1时,Frequency的值,其他的以此类推,zd2对应的DZZGSXXT取值为2时,Frequency的值,如果原来没有值,就用0补齐。
(3)SYZGSXXT从1-4扩充完整,原来Frequency有值直接用,没有的用0补齐。

谢谢各位啦,帮我想想办法,越简单越好,再次感谢!~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-10-19 20:04:01 | 只看该作者

Re: 数据变换求助

[code:1sfmq88m]data raw;
    input SYZGSXXT DZZGSXXT Frequency;
datalines;
1 1 27
1 4 27
4 1 27
4 4 27
;
data out;
    retain dz1-dz4 0;
    do SYZGSXXT=1 to 4;
        output;
    end;
run;
data temp;
    array dz(4);
    do _n_=1 by 1 until(last.syzgsxxt);
        set raw;
        by syzgsxxt;
        dz(dzzgsxxt)=frequency;
    end;
    drop dzzgsxxt frequency;
run;
data out;
    modify out temp;
    by syzgsxxt;
run;[/code:1sfmq88m]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-10-19 20:05:04 | 只看该作者

Re: 数据变换求助

[code:szlkwn7q]data raw;
    input SYZGSXXT DZZGSXXT Frequency;
datalines;
1 1 27
1 4 27
4 1 27
4 4 27
;
proc fcmp outlib=work.func.benxu;
    subroutine test(inds $,obs,outds $,row_max,col_max);
        array in_arr[1,1] /nosymbols;
        array dz[1,1] /nosymbols;
        call dynamic_array(in_arr,obs,3);
        call dynamic_array(dz,row_max,col_max);
        rc=read_array(inds,in_arr);
        do i=1 to row_max;
            do j=1 to col_max;
                dz[i,j]=0;
            end;
        end;
        do i=1 to obs;
            dz[in_arr[i,1],in_arr[i,2]]=in_arr[i,3];
        end;
        rc=write_array(outds,dz);
    endsub;
run;
options cmplib=work.func;
data _null_;
    call test('work.raw',4,'out',4,4);
run;[/code:szlkwn7q]
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
地板
发表于 2010-10-26 17:31:03 | 只看该作者

Re: 数据变换求助

[code:20zivjou]data c(drop=obs);
input Obs a b c;
cards;
1 1 2 27
2 1 3 12
3 4 1 23
4 4 4 45
;
run;

proc sort data=c  ;
by a;
proc transpose data=c out =d(drop=_name_);
by a ;
id b;
var c ;
run;
data d;
retain a _1 _2 _3 _4;
set d;
run; [/code:20zivjou]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-3 18:27 , Processed in 0.070576 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表