SAS中两种数据集的比较

SAS中两种数据集的比较,sas,Sas,我有以下数据集: data data_one; length X 3 Y $ 20; input x y ; datalines; 1 test 2 test 3 test1 4 test1 5 test 6 test 7 test1 run; data data_two; length Z 3 A $ 20; input Z A; datalines; 1 test 2 test1 3 test2 run; 我想要的是一个数据集,它告诉我data_one中

我有以下数据集:

data data_one;
length X 3
Y $ 20; 

input x y ;

datalines;
1 test
2 test
3 test1
4 test1
5 test
6 test
7 test1

    run;

data data_two;
length Z 3
       A $ 20;

input Z A;

datalines;
1 test
2 test1
3 test2
run;
我想要的是一个数据集,它告诉我data_one中的Y列与data_two中的a列包含相同字符串的频率。结果应该如下所示:

 Obs    test    test1    test2

  1       4       3        0
提前谢谢

  • 首先,我们需要数据_one中Y值的计数
  • 然后,我们创建一个排序的(用于下一次合并)数据_two中存在的值列表
  • 数据从1开始计数。与2中的列表合并。 数据2中存在但数据1中不存在的Y值
    (b和非a)
    被分配为count=0,数据2中不存在的Y值被丢弃(
    如果b
  • 最后一段将计数的垂直列表转换为一组水平变量

    前3个步骤可以替换为一个过程SQL:

    proc sql;
        create table count_all as
        select distinct
                coalesce(t1.y,t2.a) as y,
                case
                    when missing(t1.y) then 0 
                    else count(t1.y)
                end as N
            from data_one as t1
            right join data_two as t2
                on t1.y=t2.a
            group by 1
            order by 1;
    quit;
    proc transpose data=count_all out=final (drop=_name_);
        id y;
    run;
    

    我编辑代码以添加
    if b在数据步骤中,因此排除数据_-one中存在但数据_-two中不存在的Y值(在您的示例中不存在,但可能存在)。代码转储通常不被认为是好的答案。OP应该问“我如何做X”,而不是“为我做X”;因此,虽然有时代码是答案的一部分,但更重要的部分应该是解释您是如何完全正确的,我将添加一些文本来描述您需要开始显示您在问题中尝试了哪些代码的过程。我们不是来为你做工作的,但是当你试图为自己解决问题时,我们通常很乐意帮助你解决遇到的问题。我不太关心“展示工作”本身,而是太多的“完成这项任务”,而不是询问询问者不确定的具体事情。如果问得不同,这个问题可能是一个完全合理的问题,但它的提问方式意味着它不是。首先,很抱歉没有给出任何我尝试过的例子。我想我是SAS的新手。我的想法是构建一个数组或填充了列A的东西,然后以某种方式使用“do”循环和“contain”。但它不起作用,可能是完全的垃圾,所以我没有张贴它。但是谢谢你的建议。
    
    proc sql;
        create table count_all as
        select distinct
                coalesce(t1.y,t2.a) as y,
                case
                    when missing(t1.y) then 0 
                    else count(t1.y)
                end as N
            from data_one as t1
            right join data_two as t2
                on t1.y=t2.a
            group by 1
            order by 1;
    quit;
    proc transpose data=count_all out=final (drop=_name_);
        id y;
    run;