0

我有一系列每周变量来描述一个人的“状态”(从 2010 年第 1 周到 2012 年第 17 周)。

变量由下式给出:

y_1001, y_1002,...y1052, y1101, y1102,......y_1217

我这样定义变量的周期:

%let period = y_1001-1052 y_1101-y1148;

我也有一个治疗期作为开始日期和结束日期。我的挑战是在患者停止治疗后的一周内找到 y_ 变量给出的状态。

我对 SAS 不太熟悉,但我的想法是根据周计数器“选择”正确的 y_ 变量,例如通过计算自期间开始(2010 年第 1 周)到日期治疗结束。

我得到这样的治疗结束前几周

week_count = 1 + intck( 'week.2', '1JAN2010'd, end_treatment_date, 'd');

但是我怎样才能根据这个计数来检索相应的 y_ 变量呢?

在对如何遍历 period 变量并为每个人选择与 week_count 变量相对应的数字进行了徒劳的搜索之后,我想到了另一种方式……说这样的话。

array weeks(*) .
do i = 1 to dim(weeks) by 1;
  if week_count = i then end_status = y_10&i;
end

...但要考虑到数组的维度与周数和年数之间存在不匹配的修改。

但接下来我的挑战是使以下部分工作......

if week_count = i then end_status = y_10&i;

如何让 SAS 根据循环索引选择正确的 y_ 变量?这似乎是一个非常简单的问题,但不知何故我还没有找到解决方案。在定义正确的 y_ 变量时,有没有办法使用变量“i”作为输入?

如果有人可以提出一些提示,我将不胜感激。

4

2 回答 2

2

我想你想要:

if week_count = i then end_status = weeks{i};
于 2012-06-28T16:53:11.720 回答
0

VVALUEX 是 SAS 中一个鲜为人知的函数,它可以帮助您从 SAS 变量名称中提取值。在这里,您的问题是根据从 1 月 1 日到治疗结束的周数构建 SAS 变量名称。您可以通过使用以下示例中的想法来避免对每个观察使用 DO LOOP -

data _null_;
    end_treatment_date = "09FEB2010"d;
    y_1007 = 'D';
    status = vvaluex(compress("y_" || substr(strip(year(end_treatment_date)), 3, 2) || put(1 + intck("week.2", "01JAN2010"d, end_treatment_date), z2.)));
    put status;
run;

变量名称的构造如下 - 最初您获取字符串“y_”,然后使用与之前类似的逻辑将年份的最后两位数字后跟星期添加到变量 week_count。你得到你想要的变量,然后应用 VVALUEX 来获取值。如果您有数百万个观察值,则为每个观察值运行 DO LOOP 可能效率低下。

于 2012-06-29T04:34:15.763 回答