Sas 基于格式化的数值变量创建新的命名列

Sas 基于格式化的数值变量创建新的命名列,sas,Sas,我有一个数据集(DIN),由格式化的数字变量组成(例如,第1列“BLD”的值为1-3,但格式为“是”、“否”、“未知”)。所有列的格式都略有不同 在每一行中,只有一列具有值,其余列缺失。我尝试使用以下方法来获取每行的最大值(始终是非缺失值) 不幸的是,由于这些列是数字,MAX列显示为数字,而不是格式化值。我尝试使用vvalue获取格式化值,如下所示,但我不知道如何一次对所有列执行此操作 data _null_; set DIN; BLD_C = vvalue(BLD); run;

我有一个数据集(DIN),由格式化的数字变量组成(例如,第1列“BLD”的值为1-3,但格式为“是”、“否”、“未知”)。所有列的格式都略有不同

在每一行中,只有一列具有值,其余列缺失。我尝试使用以下方法来获取每行的最大值(始终是非缺失值)

不幸的是,由于这些列是数字,
MAX
列显示为数字,而不是格式化值。我尝试使用
vvalue
获取格式化值,如下所示,但我不知道如何一次对所有列执行此操作

data _null_;
    set DIN;
    BLD_C = vvalue(BLD);
run;
我觉得一个
do
循环可能会有所帮助,我尝试在一个变量名数组上循环,但它就是不起作用。似乎什么也没发生

data DIN_C;
    set DIN;
    array nums(*) _numeric_;

    do i = 1 to dim(nums);
        nums_C = vvalue(nums(i));
    end;
run;
有人能帮我吗?或者有没有其他方法可以解决这个问题?

您可以使用MAX()来查找实际的非缺失数值。然后使用WHICH()查找具有该值的变量的索引号。现在可以使用VVALUE()查找该变量的格式化值

data DIN_FIXED;
  set DIN;
  array _num BLD--VASC
  length max 8 max_formatted $50 ;
  MAX = max(of _num[*]);
  if not missing(max) then max_formatted=vvalue(_num[which(max,of _num[*])]);
run;
可以使用MAX()查找实际的非缺失数值。然后使用WHICH()查找具有该值的变量的索引号。现在可以使用VVALUE()查找该变量的格式化值

data DIN_FIXED;
  set DIN;
  array _num BLD--VASC
  length max 8 max_formatted $50 ;
  MAX = max(of _num[*]);
  if not missing(max) then max_formatted=vvalue(_num[which(max,of _num[*])]);
run;

这个问题没有解释清楚。如果变量有不同的格式,它们肯定有不同的含义,我看不到最大化的用途。此外,如果两个变量的值最大,但格式不同,您会怎么做?整个方法似乎有缺陷。不要试图用数学方法来做这件事;编写(或编写宏来编写)SELECT语句,如“if BLD ne”。然后MAX=v值(BLD);如果没有。然后MAX=v值(VASC);'你可能会发现,如果你把数据转换成一种狭长的格式,这会变得容易得多。你在这里遇到的问题就是为什么宽数据结构是不好的。这个问题没有得到清楚的解释。如果变量有不同的格式,它们肯定有不同的含义,我看不到最大化的用途。此外,如果两个变量的值最大,但格式不同,您会怎么做?整个方法似乎有缺陷。不要试图用数学方法来做这件事;编写(或编写宏来编写)SELECT语句,如“if BLD ne”。然后MAX=v值(BLD);如果没有。然后MAX=v值(VASC);'您可能还会发现,如果您将数据转换为一种高-窄格式,这会变得容易得多——您在这里面临的问题正是宽数据结构不好的原因。