zoukankan      html  css  js  c++  java
  • SAS 中的数据拼接

    1. 数据拼接分为纵向拼接和横向拼接

    (1)纵向拼接,字面意思,将另一张表的数据填充到原始数据的下面。纵向拼接,可以使用 data 步中的 set,也可以使用 proc 步中的 append。

    原始数据1:

    data Mysas.data1;
    input name $ age sex $;
    cards;
    zhou 25 f
    wang 28 m
    li 27 f
    wu 23 m
    ;
    run;


    原始数据2:

    data Mysas.data2;
    input name $ age sex $;
    cards;
    zhao 32 f
    sun 31 m
    qian 30 f
    zhen 37 m
    ;

    使用 data 步中的 set 拼接:

    data Mysas.data1;
    input name $ age sex $;
    cards;
    zhou 25 f
    wang 28 m
    li 27 f
    wu 23 m
    ;
    run;
    
    data Mysas.data2;
    input name $ age sex $;
    cards;
    zhao 32 f
    sun 31 m
    qian 30 f
    zhen 37 m
    ;
    
    data Mysas.result;
        set Mysas.data1 Mysas.data2;
    run;
    
    proc print data = Mysas.result;
    run;

    结果为:

    使用 proc 步中的 append 来拼接,虽然效率比 set 高,但是不建议,因为 append 拼接数据,会损坏原始数据:

    data Mysas.data1;
    input name $ age sex $;
    cards;
    zhou 25 f
    wang 28 m
    li 27 f
    wu 23 m
    ;
    run;
    
    data Mysas.data2;
    input name $ age sex $;
    cards;
    zhao 32 f
    sun 31 m
    qian 30 f
    zhen 37 m
    ;
    
    /* 这里的 force 是强制拼接 */
    proc append base=Mysas.data1 data=Mysas.data2 force;
    run;
    
    proc print data = Mysas.result;
    run;

    (2)横向拼接,只是数据按照变量来横向排列,对于重复的变量名,SAS 会自动覆盖。横向拼接又分为:by 变量、无 by 变量。

    原始数据为:

    无 by 变量的代码:

    data data3;
    input visit $ date $;
    cards;
    v1 20190825
    v2 20180923
    v3 20171023
    v4 20181026
    ;
    run;
    
    proc print data = data3;
    run;
    
    data data4;
    input visit $ condition $;
    cards;
    v1 good
    v2 bad
    v3 middle
    v4 well
    ;
    run;
    
    proc print data = data4;
    run;
    
    data result;
    merge data3 data4;
    run;
    
    proc print data = result;
    run;

    结果为

    有 by 变量的代码:

    data data3;
    input visit $ date $;
    cards;
    v1 20190825
    v2 20180923
    v3 20171023
    v4 20181026
    ;
    run;
    
    proc print data = data3;
    run;
    
    data data4;
    input visit $ condition $;
    cards;
    v1 good
    v2 bad
    v3 middle
    v4 well
    ;
    run;
    
    proc print data = data4;
    run;
    
    data result;
    merge data3 data4;
    by visit;
    run;
    
    proc print data = result;
    run;

    结果为:

    虽然结果是一样的,但是对于有无 by 还是有很大的区别的

    无 by 而言,merge 是按照一行一行来的,就是左边一行,右边一行,直接 merge

    有 by 而言,merge 是按照 by 的变量来 merge 的,而不是按照一行一行来的

  • 相关阅读:
    ADO.Net对Oracle数据库的操作(转)
    代码反思(1)
    继承与多态
    存储过程
    linux学习流程及内容概括
    Linux下终端快捷键
    查找算法
    epoll解读
    TCP/udp编程
    如何学习嵌入式
  • 原文地址:https://www.cnblogs.com/elkan/p/11133654.html
Copyright © 2011-2022 走看看