从字符串

时间:2016-02-03 17:56:49

标签: sas

我有类似下面的代码,我想在我的字符串中创建每2个字符组合,然后计算每个字符组合的出现次数并存储在表格中。我将把substr语句更改为do循环以迭代整个字符串。但是现在我只想让第一个字符对起作用;

data temp;
input cat $50.;
call symput ('regex', substr(cat,1,2));
&regex = 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个字符串模式。

2 个答案:

答案 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