【问题标题】:Populate SAS variable based on content of another variable根据另一个变量的内容填充 SAS 变量
【发布时间】:2012-09-20 00:08:22
【问题描述】:

我有一个变量textvar,看起来像这样:

type=1&name=bob
type=2&name=sue

我想创建一个如下所示的新表:

type  name
1     bob
2     sue

我的方法是使用scan 来拆分& 上的变量,所以对于我的第一次观察

var1      var2
type=1    name=bob

所以现在我可以再次使用扫描来分割=

vname = scan(var1, 1, '=');
value = scan(var1, 2, '=');

但是我现在如何将value 分配给名为vname 的变量?

【问题讨论】:

    标签: sas


    【解决方案1】:

    PROC TRANPSOSE 是最快的方法。您需要一个 ID 变量(虚拟或真实)。

    data test;
    informat testvar $50.;
    input testvar $;
    datalines;
    type=1&name=bob
    type=2&name=sue
    ;;;;
    run;
    
    data test_vert;
    set test;
    id+1;
    length scanner $20 vname vvalue $20;
    scanner=scan(testvar,1,"&");
    do _t=2 by 1 until (scanner=' ');   
        vname=scan(scanner,1,"=");
        vvalue=scan(scanner,2,"=");
        output;
        scanner=scan(testvar,_t,"&");
    end;
    run;
    
    proc transpose data=test_vert out=test_T;
    by id;
    id vname;
    var vvalue;
    run;
    

    【讨论】:

      【解决方案2】:

      这有帮助吗? Dynamic variable names in SAS

      我想我有一些代码可以解决这个问题,但把它留在了我的工作场所。

      【讨论】:

        【解决方案3】:

        显然你没有包含你的真实数据,但是如果每行中原始数据的格式相同,你就不能硬编码一些值吗?我的代码将“=”和“&”转换为“,”以使扫描功能更易于使用。

        data want (keep=type name);
        set test;
        _newvar=translate(testvar,",,","&=");
            type=input(scan(_newvar,2),best12.);
            length name $20;
            name=scan(_newvar,4);
        run;
        

        【讨论】:

        • 谢谢,但在我的真实数据中,变量的顺序可能会改变,所以我无法对其进行硬编码。
        猜你喜欢
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多