【问题标题】:SAS Retain not working for 1 string variableSAS Retain 不适用于 1 个字符串变量
【发布时间】:2018-09-19 10:21:50
【问题描述】:

当有超过 1 条记录具有相同的 urn 时,以下代码似乎不适用于变量 all_s。 Var1,2,3 工作正常,但那个没有,我不知道为什么。我试图让 all_s 等于 single_var1,2,3 如果它是 first.urn 则连接没有空格,但我希望它是

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

当它不是那个骨灰盒的第一个实例时。

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;

【问题讨论】:

  • 来自dataset_1single_var1-single_var3 的长度是多少?
  • 您想要每个URN 组的单行输出吗?如果不这样做,您的输出数据将显示中间 var1-var3all_s 连接。
  • 我忘了如果last.urn然后输出;谢谢!

标签: sas concatenation retain


【解决方案1】:

如果组内var1-var3 值的总长度超过$50all_s 不够大,无法包含串联。 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 有效!为什么呢?我想在 single_var1,2,3 为空白时保留空间。
    • 对于每个single_var1-single_var3 为空白的all_s 情况,您需要3 个空格吗?当组中的连续行有空白single_var1 时,var1 是否应该包含空格?
    • 是的 var1 就是这样,如果它们都是空白的,那么它将是 , , , 如果是 all_s 我想要 ' , , , ' 例如如果它们都是空白的
    • 现在您要在除第一行之外的每一行前面添加一个逗号。如果您改为在除最后一行之外的每一行的末尾添加逗号,则逗号将保护空格免受 strip 函数的影响。
    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多