Format 将数字格式设置为字符后无法拆分/子集数据

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;

在原始数据集中,性别列编码为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;
   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需要的答案。