我想在SAS数据步骤中对数据进行排序。我的确切意思是:proc sort的工作应该在数据步骤中完成。有什么解决办法吗?
假设我的工作环境中有不同数量的数据集,但所有数据集都以相似的名称开头:name_abc、name_efg、name_1ky 等。这些数据集具有相同的变量和特征,我想将它们全部设置为一个数据集。
data bigdataset;
set [all datasets that begin with name_];
run;
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以在 SAS 中执行此操作,而无需输入所有数据集?我需要它能够灵活地适应工作环境中可用的数据集的数量。
我有一个像这样的数据集(但有几百个变量):
id q1 g7 q3 b2 zz gl az tre
1 1 2 1 1 1 2 1 1
2 2 3 3 2 2 2 1 1
3 1 2 3 3 2 1 3 3
4 3 1 2 2 3 2 1 1
5 2 1 2 2 1 2 3 3
6 3 1 1 2 2 1 3 3
Run Code Online (Sandbox Code Playgroud)
我想保留ID,b2和tre,但是将其他所有内容都丢失了.在这个小的数据集中,我可以很容易地使用call missing (q1, g7, q3, zz, gl, az)- 但在一个包含更多变量的集合中,我实际上想说call missing (of _ALL_ *except …
假设我有一个在名为的数据集中表示的有向图links,它有两个变量:from_id和to_id.我想使用SAS Data Step做两件事:(1)计算节点数,(2)计算边数.
假设links数据集如下所示.
from_id to_id
----------------
1 2
2 3
3 1
3 2
Run Code Online (Sandbox Code Playgroud)
在此示例中,有3个节点和4个边.(我们可以假设没有重复的边缘中links).节点为1,2和3.边缘为1-> 2,2-> 3,3-> 1和3-> 2.
下面是一个SAS宏,它使用SAS Data Step和proc sql来计算节点和边缘.它工作得很好,但我希望使用SAS Data Step,这样可以(可能)更快地完成对节点和边缘的计数.
/* display number of nodes and edges for graph */
%macro graph_info(links);
data nodes;
set &links;
node_id = from_id;
output;
node_id = to_id;
output;
keep node_id;
run;
proc sql noprint;
select count(distinct node_id) into :numNodes from nodes;
quit;
proc datasets …Run Code Online (Sandbox Code Playgroud) 假设我有以下数据集:
data people;
input name $ age;
datalines;
Timothy 25
Mark 30
Matt 29
;
run;
Run Code Online (Sandbox Code Playgroud)
如何更改特定人的年龄?基本上,我想知道如何指定a name并告诉SAS更改该人(观察age值)的值。
我需要了解SAS如何读取/执行数据步骤.当我查找有关SAS如何读取数据步骤的信息时,我似乎找到的是有关它如何为合并目的而读取的信息,这与常规数据步骤无关.让我们说,例如,我有这行代码:
data work.DATA;
if amount_a= . then
amount_a= 1;
amount_b= 1;
amount_a= . ;
total = (amount_a + amount_b) + 0 ;
run;
Run Code Online (Sandbox Code Playgroud)
现在,鉴于此,"总"等于什么?我想知道,基本上,SAS将如何阅读这一步 - 它将首先读取/执行哪一行?它是从最后开始,然后继续前进吗?或者从顶部开始,然后继续前进?谢谢.
例如,我有一个数据集如下:
id Date
1 2000/01/01
1 2001/01/01
1 2002/01/01
2 2003/01/01
Run Code Online (Sandbox Code Playgroud)
通过datastep或sql,我如何获得id = 1和最新日期2002/01/01的记录?感谢您的帮助,并提前致谢.
目标:使用数据步骤将整个SAS数据集导出到制表符分隔的文本文件.
问题:在我能找到的每个例子中,例如这个,必须在PUT语句后面的数据步骤中指定每个变量. 是不是只有一个简单的方法来询问"所有"变量?
我已经尝试过使用PUT _ALL_,但是在输出的每一行中都包含变量名,而不是只输出值.
我正在寻找一种方法来创建一个包含数据集的某些值的字符串变量,同时通过数据步骤.
示例数据集work.test:
AddToStringYN Value
Y One
Y Two
N Three
Y Four
N Five
Run Code Online (Sandbox Code Playgroud)
所以最后,变量看起来像:OneTwoFour(甚至更好的FourTwoOne).这看起来很简单,但我似乎无法找到办法.我也尝试使用像这样的宏变量:
%let stringvar=;
Data _null_;
set work.test;
if AddToStringYN = "Y" then do;
call symput('stringvar',"&stringvar" || strip(value));
end;
Run;
Run Code Online (Sandbox Code Playgroud)
但这给了:
GLOBAL STRINGVAR Four
Run Code Online (Sandbox Code Playgroud)
所以我只得到最后一个值.我知道这一定是因为我对这个宏设施有一些误解,但我不明白为什么变量中只有最后一个值.我认为这只是最后一次调用它的实际执行或其他东西,但是当我调整代码时:
%let stringvar=;
Data _null_;
set work.test;
if AddToStringYN = "Y" then do;
call symput('stringvar'||strip(value),"&stringvar" || strip(value));
end;
Run;
Run Code Online (Sandbox Code Playgroud)
然后我确实得到了所有这些:
GLOBAL STRINGVARONE One
GLOBAL STRINGVARTWO Two
GLOBAL STRINGVARFOUR Four
Run Code Online (Sandbox Code Playgroud)
所以我的最后一个猜测是,通过数据步骤,'call symput ...'行实际上被添加到宏处理器中,其中"&stringvar"已经被替换,并且只有在最终语句之后它们全部被执行.
这是一个很好的假设还是有另一种解释?回到最初的问题:是否有一种简单的方法来实现这一目标(拥有所需的变量)?
在这个数据步骤中,我不明白做if last.y什么......你能告诉我吗?
data stop2;
set stop2;
by x y z t;
if last.y; /*WHAT DOES THIS DO ??*/
if t ne 999999 then
t=t+1;
else do;
t=0;
z=z+1;
end;
run;
Run Code Online (Sandbox Code Playgroud)