SAS中的数据输入使用循环

时间:2018-04-21 17:29:39

标签: loops sas statistics

我刚学会了"做"今天循环,并尝试使用它在SAS中输入数据。我在网上尝试过大多数例子,但我仍然无法弄明白。

我的数据集在6个治疗(1到6)的实验中使用2组线索,每组3个,视觉和音频。以秒为单位测量滞后,即5,10和15,其中有2组。 基本上它看起来像这样: Table

我想要的条目是: 1. Obs_no,范围从1到18(总共18个观测值,这使我可以轻松地删除具有IF THEN的异常值) 2.治疗类型,即听觉和视觉。 3.治疗次数1~6次,3次。 4.滞后,5,10或15。 5.数据本身

到目前为止,我的代码使得2和5成为可能,它还使用IF THEN语句和输入语句使其余的成为可能,尽管我认为这是一种更简单的方法:

data AVCue; 
do cue = 'Auditory','Visual';
    do i = 1 to 3;
        input AVCue @@;
        output;
        end;
    end;
datalines;
.204 .167 .202 .257 .283 .256 
.170 .182 .198 .279 .235 .281
.181 .187 .236 .269 .260 .258
;

使用IF THEN语句和粗略的输入法

,可以实现滞后和其余部分
data AVCue;
set AVCue;
IF i=1 THEN Lag=5;
IF i=2 THEN Lag=10;
IF i=3 THEN Lag=15;
input obs_no treatment;
cards;
1 1
2 2
3 3
4 4
5 5
6 6
7 1
8 2
9 3
10 4
11 5
12 6
13 1
14 2
15 3
16 4
17 5
18 6
;
proc print data=AVCue;
run;

如果那么应该没问题,但是这里的输入声明只是在我看来适得其反,并且打败了使用循环的目的,这对我来说是为了节省时间。如果以这种方式完成,我不妨将数据放入excel并导入它,或者通过在 input obs_no treatment; cards;中充分复制和粘贴文本来输出所有内容。 部分。

我的编码知识是基本的,很抱歉,如果这个问题听起来很愚蠢,我想知道: 1.如何使用" do"来制作一个数字列表?在SAS中循环?我做了几次尝试,我得到的是一个包含下一个数字的列表。我知道为什么会发生这种情况,循环计数到x,分配的值只是x。我只是不知道如何解决这个问题。不知何故,这并没有发生在数据线部分,我想SAS知道那里有18个数字而且条目i是相应存储的......还是什么? 2.在这种情况下,我将如何分配每个条目的数字1到6?

谢谢!

1 个答案:

答案 0 :(得分:1)

在实际数据集中读取肯定要容易得多,而不必根据值在源数据中的顺序来估算某些变量。您可以在同一数据步骤中组合SET语句和INPUT语句并使其起作用,但这可能不值得。只需制作两个数据集并合并它们。

看看你发布的照片​​看起来像TREATMENT不是一个独立的变量。相反,它只是CUE和LAG组合的标签。要使其从1到6循环,只需将其重置为1,当它变得太大时。

data AVCue; 
  do cue = 'Auditory','Visual';
    do lag= 5, 10, 15 ;
        treatment+1;
        if treatment=7 then treatment=1;
        obsno+1;
        input AVCue @@;
        output;
    end;
  end;
datalines;
.204 .167 .202 .257 .283 .256 
.170 .182 .198 .279 .235 .281
.181 .187 .236 .269 .260 .258
;

如果您让SAS猜测您想要如何定义变量,那么您可能遇到麻烦。例如,如果您更改CUE值do cue = 'Visual','Auditory';的顺序,那么SAS将使CUE的长度为$ 5而不是$ 8。添加LENGTH语句以定义之前的变量

length obsno 8 treatment 8 cue $8 lag 8 AVCue 8 ;

这也可以让您控制在数据集中创建它们的顺序。

live example

如果你真的已经有了一个SAS数据集,并且想要添加一个循环从1到6(或实际上是任何DO循环结构)的TREATMENT变量,那么可以将SET语句嵌套在DO循环中。只需记住添加显式的OUTPUT语句。

data new ;
  do treatment=1 to 6 ;
    set old;
    output;
  end;
run;