我刚学会了"做"今天循环,并尝试使用它在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?
谢谢!
答案 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 ;
这也可以让您控制在数据集中创建它们的顺序。
如果你真的已经有了一个SAS数据集,并且想要添加一个循环从1到6(或实际上是任何DO循环结构)的TREATMENT变量,那么可以将SET语句嵌套在DO循环中。只需记住添加显式的OUTPUT语句。
data new ;
do treatment=1 to 6 ;
set old;
output;
end;
run;