SAS中文论坛

标题: INPUT语句中@与@@的解释 [打印本页]

作者: shiyiming    时间: 2004-7-22 15:56
标题: INPUT语句中@与@@的解释
sas运行时,每一个input,读取数据的指针要往下移一行,每一次迭代(指程序运行到末尾)指针也要下移一行,一个@表示每个input后指针保持原来的位置,@@表示每次迭代之后指针保持原来位置。
[code:e4759]data a;
input x y @@;
cards;
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
;
run;

data b;
input x y @;
cards;
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
;
run;

data c;
input x y ;
cards;
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
;
run;

data d;
input x;
input y;
cards;
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
;
run;

data e;
input x @;
input y;
cards;
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
;
run;

data f;
input x @;
input y @;
cards;
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
;
run;

data g;
input x @;
input y @@;
cards;
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
;
run;[/code:e4759]
体会一下

原贴参见: <!-- m --><a class="postlink" href="http://sasor.feoh.net/modules.php?name=Forums&amp;file=viewtopic&amp;t=429">http://sasor.feoh.net/modules.php?name= ... opic&amp;t=429</a><!-- m -->
作者: shiyiming    时间: 2004-7-25 05:02
标题: I see! thanks so much!
Thanks! <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
作者: shiyiming    时间: 2004-7-30 16:20
标题: 建议
如果将第二排数据用2,第三排用3,余类推,可能效果会好一些
作者: shiyiming    时间: 2004-10-5 12:26
标题: Thanks
谢谢!
作者: shiyiming    时间: 2004-10-13 16:09
标题: Re: INPUT语句中@与@@的解释
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 很好!效果明显!谢谢!
作者: shiyiming    时间: 2004-12-21 20:00
标题: 疑问
引用老大的:“一个@表示每个input后指针保持原来的位置,@@表示每次迭代之后指针保持原来位置。 ”

不是很明白什么意思!
能不能从读取数据后的结果来解释一下,谢谢!
作者: shiyiming    时间: 2004-12-21 20:29
标题: 知道了!
[color=blue:51af9]在老大说的

<!-- m --><a class="postlink" href="http://sasor.feoh.net/modules.php?name=Forums&amp;file=viewtopic&amp;t=429">http://sasor.feoh.net/modules.php?name= ... opic&amp;t=429</a><!-- m -->

的帖子里面的scott2002兄弟说的让我明白了。

原话如下:

1. No @ or @@, each Data Step will read another line of data;
2. @, each Data Step will read another line of data after all declared variables are read;
3. @@, each Data Step will read another line when reach the ead of line.[/color:51af9]

我在8.2上自己用汉语理解如下:

1。如果没有@ 或 @@, 那么SAS将从输入的数据的第二行开始读数据,并且是从第二行开始,读完了所有的变量对应的数据后就跳到下一行,---比如如果第二行有10个数据,而之前定义的变量只有5个,那么只有前5个数据会被读取对应5个变量,之后跳入下一行。

2。如果使用@ ,  SAS会从输入的数据的第一行开始读数据,并且也是读完了所有的变量对应的数据后就跳到下一行。

3。如果使用@ @, SAS会从输入的数据的第一行开始读数据,并且是按照定义变量顺序一组一组的连续读数据,不会跳行。
作者: shiyiming    时间: 2005-6-15 13:59
标题: 这样处理可能效果更明显一点
data A;
input x;
do i = 1 to 3;
    input y z r;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data B;
input x;
do i = 1 to 3;
    input y z r@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data C;
input x;
do i = 1 to 3;
    input y z r@@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data D;
input x@;
do i = 1 to 3;
    input y z r;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data E;
input x@;
do i = 1 to 3;
    input y z r@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data F;
input x@;
do i = 1 to 3;
    input y z r@@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data G;
input x@@;
do i = 1 to 3;
    input y z r;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data H;
input x@@;
do i = 1 to 3;
    input y z r@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data I;
input x@@;
do i = 1 to 3;
    input y z r@@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;  

data A1;
input x;
do i = 1 to 4;
    input y z r;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data B1;
input x;
do i = 1 to 4;
    input y z r@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data C1;
input x;
do i = 1 to 4;
    input y z r@@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data D1;
input x@;
do i = 1 to 4;
    input y z r;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data E1;
input x@;
do i = 1 to 4;
    input y z r@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data F1;
input x@;
do i = 1 to 4;
    input y z r@@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data G1;
input x@@;
do i = 1 to 4;
    input y z r;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data H1;
input x@@;
do i = 1 to 4;
    input y z r@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
data I1;
input x@@;
do i = 1 to 4;
    input y z r@@;
        output;
end;
cards;
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49  
50 51 52 53 54 55 56 57 58 59  
60 61 62 63 64 65 66 67 68 69
;
run;
作者: shiyiming    时间: 2005-6-15 15:20
标题: Re: 知道了!
[quote=&quot;nfiona&quot;:5c900]我在8.2上自己用汉语理解如下:

1。如果没有@ 或 @@, 那么SAS将从输入的数据的第二行开始读数据,并且是从第二行开始,读完了所有的变量对应的数据后就跳到下一行,---比如如果第二行有10个数据,而之前定义的变量只有5个,那么只有前5个数据会被读取对应5个变量,之后跳入下一行。

2。如果使用@ ,  SAS会从输入的数据的第一行开始读数据,并且也是读完了所有的变量对应的数据后就跳到下一行。

3。如果使用@ @, SAS会从输入的数据的第一行开始读数据,并且是按照定义变量顺序一组一组的连续读数据,不会跳行。[/quote:5c900]
我试了一下,没有@ 或 @@, 和使用@效果是一样的,并不是从第二行开始读取数据的。只要把第一行的数据全定义为1,第二行全是2,以下类推,就很容易得到结论了。
作者: shiyiming    时间: 2005-6-15 15:38
标题: 明白了。
等到我修改完数据,执行完几个程序才彻底明白了shiyiming超级管理员的帖子的真正含义。
上个帖子也错了。希望不至于误导别人。
谢谢!受益匪浅。
作者: shiyiming    时间: 2005-6-15 15:41
标题: 方便大家
得益于超级管理员:
data a;
input x y @@;
cards;
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6
;
run;

data b;
input x y @;
cards;
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6
;
run;

data c;
input x y ;
cards;
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6  
;
run;

data d;
input x;
input y;
cards;
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6
;
run;

data e;
input x @;
input y;
cards;
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6
;
run;

data f;
input x @;
input y @;
cards;
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6
;
run;

data g;
input x @;
input y @@;
cards;
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6
;
run;
不妨一试。
作者: shiyiming    时间: 2005-7-19 20:07
标题: Re: 明白了。
同意!同时将数据改一下比较好,第一行为1,第二行改为2……
作者: shiyiming    时间: 2006-10-31 13:41
标题: 小问题大学问
用程序运行,又想了半天,才明白是什么意思。
没想到就这里面还有这么大的玄机。
多谢了。
作者: shiyiming    时间: 2006-11-28 22:03
标题: 赞这样的帖子!
这样的帖子 不错,不仅有讨论的氛围,也有效地交流了想法,有收获!
ps:我最近才注册,因为这学期开了sas课。
作者: shiyiming    时间: 2006-12-14 14:53
标题: to zhangchangbo307
我也觉得没有◎或◎◎和使用一个◎应该是一样的,为什么说是从第二行开始?




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2