SAS Retain不适用于1个字符串变量
当同一urn中有多条记录时,下面的代码似乎不适用于变量ALLS。Var1,2,3很好用,但那一个不行,我不知道为什么。我试图让所有的_都等于single_var1,2,3,如果它是第一个,则不带空格。urn但我希望它是 all_s=all_s+','+单变量1+单变量2+单变量3 当它不是那个瓮的第一个实例时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
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的情况,如果它们都为空,那么它将如果我想要的所有字符都是空的,例如,现在你在每一行的前面加一个逗号,除了第一行。如果你在每一行的末尾加一个逗号,除了最后一行,逗号将是