将一行与同一数据集中的多行进行比较?
我有一个数据组,看起来像这样:将一行与同一数据集中的多行进行比较?
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] = ""
我认为你需要一个更精确的问题得到你所需要的,但也许这将是一个开始。
您不能直接访问两行或更多行,但可以将一行中的值放入不同的一组变量中,并将变量与变量进行比较。因此,举例来说,如果我们想采取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;
对不起。我编辑了我的问题。我知道这不是很简洁,但我希望编辑能让它变得更好。谢谢! – lacymacc5552
似乎我的答案应该或多或少地回答你的问题,不是吗?显然'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;
你能说明一下你想要的这个样本数据的输出是什么吗?所以你想要每行的1/0结果来说明它是否与密钥匹配?或者,如果* any *记录与密钥匹配,您希望所有行的结果变量均为1? – Quentin
你在问一个没有简单答案的问题。从根本上讲,这不是一个简单的问题,因为SAS是一种一次操作一行的语言;跨行操作有些困难。你需要更精确和有限的问题才能得到你所需要的。 – Joe
我编辑了我的问题,并添加了我希望我的输出看起来像。对不起,如果它仍然没有意义。我感谢所有的帮助。 – lacymacc5552