SAS保留不适用于1个字符串变量

时间:2018-09-19 10:21:51

标签: sas concatenation retain

当具有相同urn的记录多于1条时,以下代码似乎不适用于变量all_s。 Var1,2,3可以正常工作,但是那不是,我不知道为什么。我正在尝试将all_s等于single_var1,2,3串联在一起,如果是first.urn则不带任何空格,但我希望它是

all_s = all_s +','+ single_var1 + single_var2 + single_var3

这不是那个ur的第一个实例。

data dataset_2;
    set dataset_1;
    by URN;
    retain count var1 var2 var3 all_s;
    format var1 $40. var2 $40. var3 $40. all_s $50.;
    if first.urn then do;
        count=0;
        var1 = ' ';
        var2 = ' ';
        var3 = ' ';
        all_s = ' ';
    end;
    var1 = catx(',',var1,single_var1);
    var2 = catx(',',var2,single_var2);
    var3 = catx(',',var3,single_var3);

    all_s = cat(all_s,',',single_var1,single_var2,single_var3);

    count = count+1;
    if first.urn then do;
        all_s = cat(single_var1,single_var2,single_var3);
    end;
run;

2 个答案:

答案 0 :(得分:1)

一些示例数据可能会有所帮助,但我将试一试并请您尝试

all_s = cat(strip(All_s),',',single_var1,single_var2,single_var3);

答案 1 :(得分:1)

如果组中all_s个值的总长度超过var1-var3,则

$50的大小不足以包含串联。 var1-var3$40时,这种情况似乎很可能。

我建议使用length函数来指定可变长度。 format将创建一定长度的变量作为副作用。

catx从连接中删除空白参数,因此,如果在空白single_varN中需要在连接中留空格,则将无法使用catx

一项要求指定串联以去除非空白值而空白值是一个空白的要求很可能不得不退回到传统的trim(left(…方法上

示例代码

data have;
  length group 8 v1-v3 $5;
  input group (v1-v3) (&);
datalines;
1  111  222  333
1  .    444  555
1  .    .    666
1  .    .    .
1  777  888  999
2  .    .    .
2  .    b    c
2  x    .    z
run;

data want(keep=group vlist: all_list);
  length group 8 vlist1-vlist3 $40 all_list $50;
  length comma1-comma3 comma $2;

  do until (last.group);
    set have;
    by group;

    vlist1 = trim(vlist1)||trim(comma1)||trim(left(v1));
    vlist2 = trim(vlist2)||trim(comma2)||trim(left(v2));
    vlist3 = trim(vlist3)||trim(comma3)||trim(left(v3));

    comma1 = ifc(missing(v1), ' ,', ',');
    comma2 = ifc(missing(v2), ' ,', ',');
    comma3 = ifc(missing(v3), ' ,', ',');

    all_list = 
      trim(all_list)
      || trim(comma)
      || trim(left(v1))
      || ','
      || trim(left(v2))
      || ','
      || trim(left(v3))
    ;

    comma = ifc(missing(v3),' ,',',');
  end;
run;

参考

SAS具有用于字符串连接的运算符和多个功能

  • ||串联
  • cat串联
  • catt连接并修剪(删除尾随空格)每个参数
  • cats串联,去除(删除开头和结尾的空格)每个参数
  • catx串联在一起,剥离每个参数并定界
  • catq与定界符和包含定界符的引用参数连接

来自SAS 9.2 documentation

  

比较   

CAT,CATS,CATT和CATX函数的结果通常等效于串联运算符(||)以及TRIM和LEFT函数的某些组合所产生的结果。但是,CAT,CATS,CATT和CATX函数的默认长度与使用串联运算符时获得的长度不同。有关更多信息,请参见Length of Returned Variable。   

注意::对于变量缺少值的情况,串联将产生不同的结果。参见Concatenating Strings That Have Missing Values