【问题标题】:Adding columns to a dataset in SAS using a for loop使用 for 循环将列添加到 SAS 中的数据集
【发布时间】:2016-05-31 17:19:10
【问题描述】:

我从 Python/R/Stata 背景来到 SAS,并了解到 SAS 的情况大不相同。从其中一种语言的角度来看,我正在处理以下问题,也许 SAS 不符合我的要求。

我有一个面板数据集,其中包含 age 列。我想使用此 age 列向数据集添加新列。在我的示例中,我将简化 age 的功能以使其保持简单。

目标是循环一个序列,并在每个循环步骤中使用该序列的值 1. 分配新列的名称和 2. 分配该列的值。我希望得到我的起始数据集,并在其中添加新列以获取值 spline1 spline2... spline7

    data somePath.FinalDataset; 

    do i = 1 to 7;

      if i = 1 then 
        spline&i. = age;

      if i ^= 1 then spline&i. = age + i;

    end; 
    set somePath.StartingDataset;  
    run;

这段代码甚至不会运行,虽然在早期版本中我能够让它运行,但是新列的值从它们本来应该的值向下移动了一行。我将此代码块包含为我正在尝试做的伪代码。非常感谢任何帮助

【问题讨论】:

  • 你打算循环什么?列数 (7) 是固定的还是动态的?我认为你需要一个数组。
  • 您需要发布示例输入和输出数据,以便我们了解您想要做什么。第一个明显的问题是您试图在读取数据之前对其进行操作。将 SET 语句移到其他语句上方,以便为 AGE 提供一些值供您的代码操作。

标签: sas panel


【解决方案1】:

在 SAS 中执行此操作的一种方法是使用数组。 SAS数组可以用来引用一组变量,也可以创建变量。

data have;
  input age;
  cards;
  5
  10
;
run;

data want; 
  set have;
  array spline{7}; *create spline1 spline2 ... spline7;
  do i=1 to 7;
    if i = 1 then spline{i} = age;
    else spline{i} = age + i;
  end;
  drop i;
run;

Spline{i} 引用名为 spline 的数组的第 i 个变量。
i 是一个常规变量,DROP 语句阻止它被写入输出数据集。

当您说新列“移动了一个”时,请注意 spline1=age 和 spline2=age+2。您可以相应地更改您的代码,例如如果您想要 spline2=age+1,您可以将 else 语句更改为 else spline{i} = age + i - 1 ; 也可以更改数组语句以将其定义为 0 作为下限,而不是 1。

【讨论】:

  • 我可能会在这个答案中提到 SAS 数组与其他编程语言中的数组有何不同(因为它们只是定义的变量组,而不是单独的变量/对象本身)。
  • @Joe 请随时编辑以添加该信息(我对其他语言的了解不足,无法进行智能评论:)
【解决方案2】:

数组可能是解决这个问题的最佳方法,但我将演示一种宏观方法,这在某些情况下是必要的。

SAS 将其使用数据的操作语言与其编写代码语言分离为“数据步骤语言”和“宏语言”。它们在数据步骤期间并不真正相互交谈,因为宏语言在编译阶段(在处理任何数据之前)运行,而数据步骤语言在执行阶段(正在处理数据行)运行。

无论如何,对于这样的事情,很可能编写一个宏来做你想做的事。借用 Quentin 的一般结构和初始数据集:

data have;
  input age;
  cards;
  5
  10
;
run;

%macro make_spline(var=, count=);
  %local i;
  %do i = 1 %to &count;
    %if &i=1 %then &var.&i. = &var.;
    %else &var.&i. = &var. + &i.;
    ;  *this semicolon ends the assignment statement;
  %end;

  /* You end up with the IF statement generating:
         age1 = age
     and the extra semicolon after the if/else generates the ; for that line, making it
         age1 = age; 
     etc. for the other lines.
  */
%mend make_spline;


data want; 
  set have;
  %make_spline(var=age,count=7);
run;

这将执行您想要执行的操作。循环是在宏语言中,而不是在数据步骤中。您可以分配您认为合适的参数;我更喜欢上面的参数,甚至更多(开始循环也可以是参数,实际上赋值代码也可以是参数!)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多