【问题标题】:Create new row to data set based existing ones SAS为基于现有数据集的数据集创建新行 SAS
【发布时间】:2017-12-08 09:31:44
【问题描述】:

我有一个看起来像这样的数据集:

var1 var2   count 
cat1    no     1
cat1    yes    4
cat1    unkown 3
cat2    no     7
cat2    yes    3
cat2    unkown 5
cat3    no     2
cat3    yes    9
cat3    unkown 0

我想要做的是将 var1 和 var2 组合成新变量,其中第一行来自 var1,其他行来自 var2。所以它应该看起来像:

comb   count 
cat1    
no     1
yes    4
unkown 3
cat2
no     7    
yes    3
unkown 5
cat3    
no     2
yes    9
unkown 0

任何帮助将不胜感激!

【问题讨论】:

    标签: sas


    【解决方案1】:

    这很简单。

    这里的解决方案:

    1) 创建数据集源:

    data testa;
     infile datalines dsd dlm=',';
       input var1 : $200. var2 : $200. count : 8. ;
       datalines;
    cat1,no,1,
    cat1,yes,4,
    cat1,unkown,3,
    cat2,no,7,
    cat2,yes,3,
    cat2,unkown,5,
    cat3,no,2,
    cat3,yes,9,
    cat3,unkown,0,
    ; 
    run;
    

    2) 变量列表的选择:cat1|cat2|cat3

    proc sql;
        select distinct(var1) into: list_var separated by '|' from testa;
    run;
    

    3) 逐一处理var列表

    %macro processListVar(list_var);
    
        data want;
        run;
    
        %let k=1;
        %do %while (%qscan(&list_var, &k,|) ne );
            %let var = %scan(&list_var, &k,|);
    
    
            data testb(drop=var1 rename=(var2=comb));
                set testa;
                N=_N_+1+&k;
                where var1="&var";
            run;
    
            data testc;
                N=1+&k;
                comb="&var";
                count=.;
            run;
    
            data tmp;
                set testb testc;
            run;
    
            proc sort data=tmp out=teste;
            by N;
            run;
    
            data want;
                set want teste;
            run;
    
            %put var=&var;
            %let k = %eval(&k + 1);
        %end;
    
    %mend processListVar;
    
    %processListVar(&list_var);
    

    4) 最后你会得到数据集中想要的结果。

    您必须像这样最终排除 N 列:

    data want_cleaned (drop=N);
    set want;
    run;
    

    5) 更多代码说明。

    一个。关键问题是保持 cat1,cat2,cat3 之间的顺序。

    b.因此,我将问题按每个数据集 cat1、cat2、.. 进行了划分,并创建了一个 %do %while 来循环遍历类别。

    c。我们使用 N 列,来计算行数(就像一个索引),然后我们可以在这个列上进行排序,保持顺序。

    d。例如: 第一个 var cat1 :我们选择列 var2,我们将其重命名为梳状列。我们删除 var1 列。它创建 testb 数据集。 testb 数据集用于创建索引(第 N 列),我们在 testc 中创建子数据集的第一行(N=1+&k)。 &k 用于所有子数据集。就像索引在子数据集之间继续一样。 (互不干扰)。我们在 testb 和 testc 之间进行合并。数据集 tmp 包含 cat1 所需的所有信息。然后我们合并 dataset want 中的所有子数据集。

    总而言之,我们创建了一个循环,最后将数据集合并在一起。我们对 N 列进行排序,以按您想要的顺序显示行。

    问候,

    【讨论】:

    • 非常感谢您的回答和努力。我应该在问题中提到我有 40 个 cat 变量,当然它们都有不同的计数,所以我猜想把它们都写下来会很累。 ://
    • 不客气。是的,您可以将其用于 3 个以上的类别。不要忘记勾选正确的答案:) 问候
    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多