我有类似下面的代码,我想在我的字符串中创建每2个字符组合,然后计算每个字符组合的出现次数并存储在表格中。我将把substr语句更改为do循环以迭代整个字符串。但是现在我只想让第一个字符对起作用;
data temp;
input cat $50.;
call symput ('regex', substr(cat,1,2));
®ex = count(cat,substr(cat,1,2));
datalines;
bvbvbsbvbvbvbvblb
dvdvdvlxvdvdgd
cdcdcdcdvdcdcdvcdcded
udvdvdvdevdvdvdvdvdvdvevdedvdv
dvdkdkdvdkdkdkudvkdkd
kdkvdkdkvdkdkvudkdkdukdvdkdkdkdv
dvkvwduvwdedkd
;
run;
预期结果;
cat bv dv cd ud kd
#### 6
#### 4
#### 8
#### 1
#### 3
#### 9
#### 1
我不想使用proc转置,因为我无法遍历字符串来创建所有字符对。我将不得不手动创建它们,每个字符串最多有500个字符,而且我想搜索3和4个字符串模式。
答案 0 :(得分:0)
你不能直接做你要求的事。您将不得不使用宏语言,或使用PROC TRANSPOSE。 SAS并不允许您以您尝试的方式引用数据,因为它必须在读取任何内容之前已经构造了变量名称等。
我会发布一个使用宏语言的不同解决方案,但我怀疑TRANSPOSE是最终的解决方案;没有实际的理由不应该解决你的实际问题,如果你遇到麻烦就应该可以提供帮助 - 发布do循环和你想要的东西,我们当然可以提供帮助。可能你只需要将OUTPUT放在do循环中。
data temp;
input cat $50.;
cat_val = substr(cat,1,2);
_var_ = count(cat,substr(cat,1,2));
output;
datalines;
bvbvbsbvbvbvbvblb
dvdvdvlxvdvdgd
cdcdcdcdvdcdcdvcdcded
udvdvdvdevdvdvdvdvdvdvevdedvdv
dvdkdkdvdkdkdkudvkdkd
kdkvdkdkvdkdkvudkdkdukdvdkdkdkdv
dvkvwduvwdedkd
;
run;
proc transpose data=temp out=temp_T(drop=_name_);
by cat notsorted; *or by some ID variable more likely;
id cat_val;
var _var_;
run;
答案 1 :(得分:0)
这是一个使用B
而不是宏语言的解决方案,因为我认为这实际上是一个更好的解决方案。我不会在生产中使用它,但它希望显示这个概念(特别是,我不会分别为每个变量运行CALL EXECUTE
- 我会将所有重命名连接成一个字符串然后在结束。我认为这更好地展示了这个过程如何运作。)
这利用了时间 - 即PROC DATASETS
在数据步骤终止后发生,因此通过 点你知道哪个变量映射到哪个数据点。它必须传递两次数据才能删除虚假变量,但是如果你知道你想要的变量的实际数量,或者你是否可以使用多余的变量,那就可以了。要跳过这一点,并且CALL EXECUTE
实际上并没有打开整个数据集,所以它会非常快(即使上面有五个调用也很快)。
PROC DATASETS