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

SAS Retain不适用于1个字符串变量,sas,concatenation,retain,Sas,Concatenation,Retain,当同一urn中有多条记录时,下面的代码似乎不适用于变量ALLS。Var1,2,3很好用,但那一个不行,我不知道为什么。我试图让所有的_都等于single_var1,2,3,如果它是第一个,则不带空格。urn但我希望它是 all_s=all_s+','+单变量1+单变量2+单变量3 当它不是那个瓮的第一个实例时 data dataset_2; set dataset_1; by URN; retain count var1 var2 var3 all_s; form

当同一urn中有多条记录时,下面的代码似乎不适用于变量ALLS。Var1,2,3很好用,但那一个不行,我不知道为什么。我试图让所有的_都等于single_var1,2,3,如果它是第一个,则不带空格。urn但我希望它是

all_s=all_s+','+单变量1+单变量2+单变量3

当它不是那个瓮的第一个实例时

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;

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

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

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

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

如果组内
var1-var3
值的总长度超过
$50
,则
所有的
都不足以包含串联。如果
var1-var3
$40
,则可能出现这种情况

我建议使用
length
函数指定可变长度<代码>格式
将创建一个特定长度的变量作为副作用

catx
从串联中删除空参数,因此如果在具有空
single\u 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;
参考

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
    与包含分隔符的分隔符和引号参数连接

比较 CAT、CATS、CATT和CATX函数的结果通常与级联运算符(| |)的某些组合产生的结果等效以及TRIM和LEFT函数。但是,CAT、CATS、CATT和CATX函数的默认长度与使用串联运算符时获得的长度不同。有关更多信息,请参阅。 注意:对于缺少值的变量,串联会产生不同的结果。请参阅


如果组内
var1-var3
值的总长度超过
$50
,则
all\u
不足以包含串联。如果
var1-var3
$40
,则可能出现这种情况

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

catx
从串联中删除空参数,因此如果在具有空
single\u 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;
参考

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
    与包含分隔符的分隔符和引号参数连接

比较 CAT、CATS、CATT和CATX函数的结果通常与级联运算符(| |)的某些组合产生的结果等效以及TRIM和LEFT函数。但是,CAT、CATS、CATT和CATX函数的默认长度与使用串联运算符时获得的长度不同。有关更多信息,请参阅。 注意:对于缺少值的变量,串联会产生不同的结果。请参阅


它是有效的!为什么?我想在单变量1,2,3为空时保留空间。对于
所有
情况下的每个
单变量1-单变量3
为空,您想要3个空间吗?当组中连续行的
单变量1
为空时,
var1
是否应该包含一个空间?是的,如果如果y都是空的,那么它将是,,,如果我想要的是,,,如果它们都是空的,例如,现在你在除第一行之外的每一行前面添加一个逗号。如果你在除最后一行之外的每一行末尾添加逗号,逗号将保护空格不受strip函数的影响。它起作用了!为什么?我想要当单个变量1、2、3为空时保留空格。对于
所有
情况下的每个
单个变量1-single\u var3
为空,是否需要3个空格?当组中连续行的
单个变量1
为空时,
var1
是否应该包含空格?是的,这就是var1的情况,如果它们都为空,那么它将如果我想要的所有字符都是空的,例如,现在你在每一行的前面加一个逗号,除了第一行。如果你在每一行的末尾加一个逗号,除了最后一行,逗号将是