gpt4 book ai didi

sas - 如何更简单地转置数据集

转载 作者:行者123 更新时间:2023-12-04 08:41:04 27 4
gpt4 key购买 nike

我想让数据集如下所示。我明白了,但这是一个很长的程序。
我想它会变得更简单。如果你有好的想法,请给我一些建议。
enter image description here
这是数据。

data test;
input ID $ NO DAT1 $ TIM1 $ DAT2 $ TIM2 $;
cards;
1 1 2020/8/4 8:30 2020/8/5 8:30
1 2 2020/8/18 8:30 2020/8/19 8:30
1 3 2020/9/1 8:30 2020/9/2 8:30
1 4 2020/9/15 8:30 2020/9/16 8:30
2 1 2020/8/4 8:34 2020/8/5 8:34
2 2 2020/8/18 8:34 2020/8/19 8:34
2 3 2020/9/1 8:34 2020/9/2 8:34
2 4 2020/9/15 8:34 2020/9/16 8:34
3 1 2020/8/4 8:46 2020/8/5 8:46
3 2 2020/8/18 8:46 2020/8/19 8:46
3 3 2020/9/1 8:46 2020/9/2 8:46
3 4 2020/9/15 8:46 2020/9/16 8:46
;
run;
这是我的程序。
 data
t1(keep = ID A1 A2 A3 A4)
t2(keep = ID B1 B2 B3 B4)
t3(keep = ID C1 C2 C3 C4)
t4(keep = ID D1 D2 D3 D4);
set test;
if NO = 1 then do;
A1 = DAT1;
A2 = TIM1;
A3 = DAT2;
A4 = TIM2;
end;
*--- cut (NO = 2, 3, 4 are same as NO = 1)--- ;
end;
if NO = 1 then output t1;
if NO = 2 then output t2;
if NO = 3 then output t3;
if NO = 4 then output t4;
run;

proc sort data = t1;by ID; run;
proc sort data = t2;by ID; run;
proc sort data = t3;by ID; run;
proc sort data = t4;by ID; run;
data test2;
merge t1 t2 t3 t4;
by ID;
run;

最佳答案

从高到非常宽的数据转换通常是

  • 粗略地说,您将数据放入元数据(列名或标签)或丢失引用上下文,或
  • 人类消费的报告布局

  • 假设您的“像下面这样的数据集”是准确的,并且您希望以这种方式对数据进行透视。
    方式 1 - 通过重命名自我合并子集
    您应该看到 NO字段是一个序列号,可以用作 BY合并数据集时的变量。
    将此示例代码视为模板,该模板可能是宏的源代码生成: NO更名为 seq为了更好的清晰度
    data want;
    merge
    have (where=(seq=1) rename=(dat1=A1 tim1=B1 dat2=C1 tim2=D1)
    have (where=(seq=2) rename=(dat1=A2 tim1=B2 dat2=C2 tim2=D2)
    have (where=(seq=3) rename=(dat1=A3 tim1=B3 dat2=C3 tim2=D3)
    have (where=(seq=4) rename=(dat1=A4 tim1=B4 dat2=C4 tim2=D4)
    ;
    by id;
    run;
    对于像上述模式那样组织的未知数据集,代码生成需求应该是显而易见的;确定最大 seq 并指定要旋转的变量的名称(作为宏参数,其中发生名称循环)。
    方式 2 - 多个转置
    注意,所有透视列都将是字符类型并包含原始值的格式化结果。
    proc transpose data=have(rename=(dat1=A tim1=B dat2=C tim2=D)) out=stage1;
    by id seq;
    var a b c d;
    run;

    proc transpose data=stage1 out=want;
    by id;
    var col1;
    id _name_ seq;
    run;
    方式 3 - 使用数组和 DOW 循环
    * presume SEQ is indeed a unit monotonic sequence value;
    data want (keep=id a1--d4);
    do until (last.id);
    array wide A1-A4 B1-B4 C1-C4 D1-D4;
    wide [ (seq-1)*4 + 1 ] = dat1;
    wide [ (seq-1)*4 + 2 ] = tim1;
    wide [ (seq-1)*4 + 3 ] = dat2;
    wide [ (seq-1)*4 + 4 ] = tim2;
    end;

    keep id A1--D4;

    * format A1 A3 B1 B3 C1 C3 D1 D3 your-date-format;
    * format A2 A4 ................. your-time-format;
    方式 4 - 将您的数据值更改为 datetime
    我会把这个留给尊敬的其他人

    关于sas - 如何更简单地转置数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64568730/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com