Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 使用循环在SAS中输入数据_Loops_Sas_Statistics - Fatal编程技术网

Loops 使用循环在SAS中输入数据

Loops 使用循环在SAS中输入数据,loops,sas,statistics,Loops,Sas,Statistics,我今天刚刚了解了“do”循环,并想尝试将其用于SAS中的数据输入。我在网上试过很多例子,但我还是搞不懂 我的数据集在一个实验中使用了6个处理(1到6个),使用了2组线索,每组3个,视觉和听觉。有以秒为单位的滞后,分别为5秒、10秒和15秒,有两组。 基本上是这样的: 我想要的条目是: 1.Obs_no,范围从1到18(总共18个观察值,这使我可以使用IF THEN轻松删除异常值) 2.治疗类型,包括听觉和视觉。 3.处理编号,1至6,3套。 4.滞后,5,10或15。 5.以及数据本身 到目前

我今天刚刚了解了“do”循环,并想尝试将其用于SAS中的数据输入。我在网上试过很多例子,但我还是搞不懂

我的数据集在一个实验中使用了6个处理(1到6个),使用了2组线索,每组3个,视觉和听觉。有以秒为单位的滞后,分别为5秒、10秒和15秒,有两组。 基本上是这样的:

我想要的条目是: 1.Obs_no,范围从1到18(总共18个观察值,这使我可以使用IF THEN轻松删除异常值) 2.治疗类型,包括听觉和视觉。 3.处理编号,1至6,3套。 4.滞后,5,10或15。 5.以及数据本身

到目前为止,我的代码使2和5成为可能,它还通过IF-THEN语句和input语句使其余的成为可能,尽管我假设有一种更简单的方法:

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语句和粗略的输入方法,可以实现Lag和其他功能:

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;
IF-THEN应该很好,但我认为这里的输入语句适得其反,并且违背了使用循环的目的,这对我来说是为了节省时间。如果这样做的话,我还不如把数据放进excel并导入,或者用大量的文本拷贝和粘贴在

input obs_no treatment;
cards;

我的编码知识是基础知识,如果这个问题听起来很愚蠢,我想知道: 1.如何使用SAS中的“do”循环创建数字列表?我做了几次尝试,得到的只是一个包含下一个数字的列表。我知道为什么会发生这种情况,循环计数为x,分配的值就是x。我只是不知道该怎么解决这个问题。不知何故,这并没有发生在datalines部分,我想SAS知道有18个数字,我的条目也相应地存储了起来。。。还是什么? 2.在这种情况下,我将如何为每个条目分配数字1到6


谢谢

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

看你贴的照片,治疗似乎不是一个独立变量。相反,它只是提示和滞后组合的标签。要使它从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猜测如何定义变量,您可能会遇到麻烦。例如,如果您更改提示值的顺序
do CUE='Visual','auditional'然后SAS将制作长度为$5而不是$8的提示。在使用变量之前,添加长度语句定义变量

length obsno 8 treatment 8 cue $8 lag 8 AVCue 8 ;
这还可以让您控制它们在数据集中的创建顺序

如果您确实已经有了一个SAS数据集,并且希望添加一个从1循环到6的变量(或者任何DO循环构造),那么可以将SET语句嵌套在DO循环中。请记住添加显式输出语句

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

您只有模式所需值的一半。2*6*3=36,而不是18。很抱歉混淆了,有2种提示类型和3个延迟值,2*3=6表示治疗。每个处理应用于3个单元,总共18个。我把有问题的表格包括进去了。257、.283和.256是视觉的,然后回到听觉的。感谢您提供的示例代码,我将尝试对其进行一些修改。更新以删除作为自变量的处理。