Format 将数字格式设置为字符后无法拆分/子集数据
在原始数据集中,性别列编码为1或2。使用用户定义的格式后,性别显示为“女性”和“男性”。我想将数据集拆分为两个数据集,其中只包含“女性”或“男性”。 以下代码不起作用Format 将数字格式设置为字符后无法拆分/子集数据,format,sas,subset,numeric,Format,Sas,Subset,Numeric,在原始数据集中,性别列编码为1或2。使用用户定义的格式后,性别显示为“女性”和“男性”。我想将数据集拆分为两个数据集,其中只包含“女性”或“男性”。 以下代码不起作用 data test; input gender age; CARDS; 1 43 2 43 1 55 2 56 ;run; proc format; value GENDER 1 = 'Female' 2 = 'Male' ;run; proc datasets; modify test;
data test;
input gender age;
CARDS;
1 43
2 43
1 55
2 56
;run;
proc format;
value GENDER
1 = 'Female'
2 = 'Male' ;run;
proc datasets;
modify test;
format gender GENDER.;run;
data female male;set test;
if gender = 'Female' then output female;
if gender = 'male' then output male;run;
我将得到一个错误作为
NOTE: Character values have been converted to numeric values at the places given by:
(Line):(Column).
但是如果我把最后一部分改成下面的代码。它会起作用的
data female male;set test;
if gender = 1 then output female;
if gender = 2 then output male;run;
我知道问题来自于比较字符和数值。但我想知道,在比较中我是否可以使用“女性”和“男性”?在某些情况下,检查用户定义格式的每个定义真的很烦人。谢谢 不太可能。格式仅适用于外观,因此需要基础值。如果需要,可以使用PUT()转换为字符,以使用格式化的值
If Put(gender, gender.) = 'male' then output male;
此外,请注意,要求将SAS数据集拆分为子集的情况非常罕见。通常,由用户使用更有效
编辑:根据下面的评论
正确的方法是使用VVALUE,它将返回变量的格式化值,但不需要知道用户定义的格式名称或变量类型
if vvalue(gender) = 'male' then output male;
您还可以使用
vvalue(gender)
而不是put
Plus vvalue,这样您就不必知道变量的类型。您也不需要知道格式的名称。是的。格式名称才是真正的问题。PUT对于任何一种数据类型都是一样的。我建议在答案中添加VVALUE信息——我认为这确实更接近OP需要的答案。