【发布时间】:2023-04-02 00:32:01
【问题描述】:
您好,我正在处理以下问题。我有一项调查,您可以在其中标记几个答案并添加自己的答案。我试图获得独特的答案,以便能够计算它们的出现,例如:假设我们有 3 个答案:a、b、c。第 1 个人标记答案 a,第 2 个人标记答案 b,c,第 3 个人标记答案 a,c。我想收到结果:“a”被标记了 2 次。为此,我试图删除重复的答案并创建一个存储这些唯一答案的宏变量:a、b、c。
我已经将所有调查问题重命名为 v1-v&n_que。其中 n_que 是一个宏变量,用于保存有关调查中问题数量的信息。我试图将所有答案拆分成一个表(使用前面的示例,我会得到一个包含以下值的列):a、b、c、a、c。然后我想整理这些数据并删除重复项。我尝试了以下方法:
%macro coll_ans(lib, tab);
%do _i_ = 1 %to &n_que. %by 1;
%global betav&_i_.;
proc sql noprint;
select distinct v&_i_. into :betav&_i_. separated by ', '
from &lib..&tab.
where v&_i_. ^= ' ';
quit;
data a&_i_.;
%do _j_ = 1 %to %sysfunc(countw(%quote(&&&betav&_i_.), ',')) %by 1;
text = %scan(%quote(&&&betav&_i_), &_j_., ',');
output;
%end;
run;
%end;
%mend coll_ans;
值得一提的是,如果有人选择了超过 1 个答案,例如 a 和 b,答案用逗号分隔,这就是我选择这个分隔符的原因,以统一记录。 我几乎尝试了所有方法,将 %quote 更改为 %bquote、%superq、编写 && 而不是 &&&,并且我不断收到以下错误(其他 40 个错误中的第一个):
ERROR: The function NO is unknown, or cannot be accessed.
“否”是调查中第一个问题的答案之一,完整答案是:否(转到第 9 个问题)。值得一提的是,整个调查都是波兰语,但我使用的是正确的编码,所以我不相信它可能会导致一些问题(希望如此)。
感谢所有的建议,因为我遇到了一堵无法逾越的墙
【问题讨论】:
-
请添加一些记录以显示您拥有的数据示例。 (可能是带有 ID 变量的假数据和像你描述的“a”、“b”、“c”这样的答案)。应该可以通过将数据转置到每个 ID-answer 的一条记录、重复数据删除然后运行 PROC FREQ 来获得您所描述的内容。您不需要拆分为多个数据集。您应该能够使用 DO 循环进行转置,而不需要宏 %DO 循环。
标签: string macros sas sas-macro