将一行与同一数据集中的多行进行比较?

问题描述:

我有一个数据组,看起来像这样:将一行与同一数据集中的多行进行比较?

AAAAKEY C A C A A B A B C 
1  B A B A A B A B A 
3  A A B A A A A B A 
5  D A C A A B A A A 

为了说明的目的我已超过40行和130列删去。我想要做的是将“KEY”行与使用数组,逻辑和循环的以下行进行比较。但是,我不断收到错误。在单个数据集中比较一行到多行需要哪种语句?我正在寻找的最终结果是,如果“关键”行中的答案与任何其他行中的答案匹配,则输出1,否则输出0. **编辑: 真的,我正在寻找因为最终输出是分别与原始数据集匹配的“矩阵”类型事物。 这将是这个样子:

1 1 1 1 1 1 1 1 
0 1 0 1 1 1 1 0 
0 1 0 1 0 1 1 0 
0 1 1 1 1 1 0 0 

随着第一行是关键行,其余都进行了比较,键行的行。

我试图启动一个,但我完全卡住,不知道该怎么做。

data form_a2; 
set form_a; 
array a[*] _character_; 
do i=1 to dim(a); 
if x[i] = "" 
+0

你能说明一下你想要的这个样本数据的输出是什么吗?所以你想要每行的1/0结果来说明它是否与密钥匹配?或者,如果* any *记录与密钥匹配,您希望所有行的结果变量均为1? – Quentin

+0

你在问一个没有简单答案的问题。从根本上讲,这不是一个简单的问题,因为SAS是一种一次操作一行的语言;跨行操作有些困难。你需要更精确和有限的问题才能得到你所需要的。 – Joe

+0

我编辑了我的问题,并添加了我希望我的输出看起来像。对不起,如果它仍然没有意义。我感谢所有的帮助。 – lacymacc5552

我认为你需要一个更精确的问题得到你所需要的,但也许这将是一个开始。

您不能直接访问两行或更多行,但可以将一行中的值放入不同的一组变量中,并将变量与变量进行比较。因此,举例来说,如果我们想采取SASHELP.CLASS大家,看看他们如何比较阿尔弗雷德(类数据集的第一个成员):

data test; 
    if _n_=1 then do; 
    set sashelp.class(rename=(age=age_key height=height_key weight=weight_key) keep=age height weight); 
    end; 
    set sashelp.class; 
    age_dif = (age - age_key); 
    height_dif = (height - height_key); 
    weight_dif = (weight - weight_key); 
run; 

当然,你可以使用数组做出,而不是指这更容易每一个都是单独的,而且你可能不想重命名130个变量。因此,让我们做到这一点,使用临时数组稍微更简单的方法:

data test; 
    if 0 then set sashelp.class; 
    array compvars[3] _temporary_; *storing the key values; 
    array numvars[*] _numeric_;  *storing the original numeric values; 
    array diff[3];     *storing the new difference values; 
    if _n_=1 then do;     *initializing COMPVARS to the first row; 
    set sashelp.class; 
    do _i = 1 to dim(numvars); 
     compvars[_i] = numvars[_i]; 
    end; 
    end; 
    set sashelp.class;     
    do _i = 1 to dim(numvars);  *now you perform the difference calc; 
    diff[_i] = numvars[_i] - compvars[_i]; 
    end; 
run; 
+0

对不起。我编辑了我的问题。我知道这不是很简洁,但我希望编辑能让它变得更好。谢谢! – lacymacc5552

+0

似乎我的答案应该或多或少地回答你的问题,不是吗?显然'diff'位有所不同,但它很容易适应?如果没有,请解释您还有哪些问题。 – Joe

请问下面的工作方式适合你?

/* generate a larger initial dataset */ 
%let n_col = 150; 
data have; 
    call streaminit(1); 
    length id 3; 
    array col_ [&n_col.] $2; 
    do id = 1 to 45; 
     do i = 1 to &n_col.; 
      col_[i] = scan("A B C D",ceil(rand('UNIFORM')*4)); 
     end; 
     output; 
    end; 
    drop i; 
run; 

/* perform comparison */ 
data want; 
    set have; 

    array col_ [&n_col.] $2 col_:; 
    array key_ [&n_col.] $2; 
    retain key_:; 
    array match_[&n_col.]; 

    /* arbitrarily choose first observation as "key", retain this array */ 
    if _N_ = 1 then do i = 1 to &n_col.; 
     key_[i] = col_[i]; 
    end; 

    /* for each compare each record to the "key" */ 
    do i = 1 to &n_col.; 
     match_[i] = ifn(key_[i] = col_[i],1,0); 
    end; 
    drop i col_: key_:; 
run;