我使用AVISITN填充某些记录的VISITNUM值,使用AVISITN作为引用填充VISITNUM的值。两者都是数值变量。因此,如果AVISITN = 10,我希望丢失的VISITNUM为1,等等。
proc format;
invalue dummy_visnum
10 = 1
20 = 2
30 = 4
40 = 5
50 = 6
60 = 7
70 = 8
80 = 9
100= 10;
quit;
data have;
input VISITNUM :8. AVISITN :8.;
infile datalines dlm = '|';
datalines;
1|10|
2|20|
4|30|
5|40|
6|50|
7|60|
8|70|
1|10|
2|20|
4|30|
5|40|
6|50|
|60|
|70|
|80|
1|10|
2|20|
4|30|
5|40|
|50|
|60|
|70|
|80|
1|10|
2|20|
|30|
|40|
|50|
|60|
|70|
|80|
;
RUN;
data want;
input VISITNUM :8. AVISITN :8.;
infile datalines dlm = '|';
datalines;
1|10|
2|20|
4|30|
5|40|
6|50|
7|60|
8|70|
1|10|
2|20|
4|30|
5|40|
6|50|
7|60|
8|70|
9|80|
1|10|
2|20|
4|30|
5|40|
6|50|
7|60|
8|70|
9|80|
1|10|
2|20|
4|30|
5|40|
6|50|
7|60|
8|70|
9|80|
;
RUN;
但是,当我运行这段代码时,它按预期工作,但我在日志中得到了一个警告:“数字值已转换为由:(行):(列)提供的位置上的字符值。”
visitnum = input(avisitn, dummy_visnum.);
PROC格式的VALUE语句用于定义格式。INVALUE语句用于定义INFORMAT。在SAS中,您使用格式将值转换为文本,而INFORMAT用于将文本转换为值。对于INFORMAT,您正在告诉SAS,AVISITN是文本,但实际上是一个数字。因此,SAS将AVISITN转换为文本。因此,我知道这种方法不起作用,因为AVISITN正在被转换为文本,这将导致日志中的警告。所以我可以尝试这样的方法
if missing(visitn) then visitn = avisitn / 10 or
visitnum = input(cats(mod(avisitn,10)),dummy_visnum.);
但是,数据有点异步,因为它没有一对一的转换,因为visitnum =3是AVISITN = 40,VISITNUM 4到9的转换是一样的,只有1,2和10才能工作。有没有人有其他的建议?我看到了一个使用find的散列对象data_null步骤,但不确定这在这里是否有效。
发布于 2022-11-05 15:39:35
..。您还可以使用INFORMAT将文本转换为数字。
因此,创建一种格式,将数字转换为与所需数字类似的字符串。然后,可以使用调用PUT()将数字转换为字符串,并将结果传递给PUT()以将这些字符串转换为数字。
proc format ;
value num2char
10 ='1'
20 ='2'
30 ='4'
40 ='5'
50 ='6'
60 ='7'
70 ='8'
80 ='9'
;
run;
data want;
set have;
avistn = input(put(visitnum,num2char.),32.);
run;
https://stackoverflow.com/questions/74328773
复制相似问题