【发布时间】:2018-03-14 18:40:55
【问题描述】:
我有一堆字符变量,需要从大型数据集中整理出来。不需要的变量都有相同或全部丢失的条目(这意味着我想在进一步处理数据之前从数据集中删除这些)。数据集非常大,因此无法手动完成,我会做很多次,所以我试图创建一个宏来完成这个。我使用以下代码创建了一个包含所有字符变量的列表宏变量(我的部分数据不同,但我使用相同类型的代码):
data test;
input Obs ID Age;
datalines;
1 2 3
2 2 1
3 2 2
4 3 1
5 3 2
6 3 3
7 4 1
8 4 2
run;
proc contents
data = test
noprint
out = test_info(keep=name);
run;
proc sql noprint;
select name into : testvarlist separated by ' ' from test_info;
quit;
然后我的想法是仅使用数据步骤从原始数据集中删除此变量列表。现在,问题是我需要遍历每个变量,并确定该变量的观察结果是否都相同。我的想法是创建一个循环遍历所有变量的宏,并为每个变量计算条目的出现次数。由于该表的长度等于唯一条目的数量,因此我知道如果表的长度为 1,则应删除该变量。到目前为止,我的尝试是以下代码:
%macro ListScanner (org_list);
%local i next_name name_list;
%let name_list = &org_list;
%let i=1;
%do %while (%scan(&name_list, &i) ne );
%let next_name = %scan(&name_list, &i);
%put &next_name;
proc sql;
create table char_occurrences as
select &next_name, count(*) as numberofoccurrences
from &name_list group by &next_name;
select count(*) as countrec from char_occurrences;
quit;
%if countrec = 1 %then %do;
proc sql;
delete &next_name from &org_list;
quit;
%end;
%let i = %eval(&i + 1);
%end;
%mend;
%ListScanner(org_list = &testvarlist);
虽然我遇到了语法错误,并且我的真实数据遇到了其他类型的问题,无法正确读取数据,但我一次只采取了一步。我在想我可能会使事情变得过于复杂,所以如果有人有更简单的解决方案或者可以看到可能出现的问题,我将非常感激。
【问题讨论】:
-
不明白你想做什么,在你的宏程序中,问题是proc sql中的&name_list,&name_list被解析为变量列表,而不是数据集。
-
您可以随时推出自己的产品,但有一些解决方案。我建议搜索 SAS 博客或 Google:“sas rick wicklin missing”。最快的方法是通过 IML,“最简单”的编码方法是 PROC FREQ 并使用 NLEVELS 变量。它还取决于什么是大文件。使用 PROC FREQ 方法应该可以处理少于 1000 万条记录,尽管它也可能取决于您的内存设置。
-
您提到了字符变量,但您的示例是数字变量。变量是字符还是数字?