gpt4 book ai didi

database - 如何通过 IML 替换处理 SAS 文件的整个观察

转载 作者:搜寻专家 更新时间:2023-10-30 22:59:52 24 4
gpt4 key购买 nike

老用户,第一次发布。我是 IML 的新手,之前在 R 中玩过。我目前正在尝试创建一个邻接表,以便更轻松地计算 SAS/IML 中的网络。我正在处理的文件很大。我正在做一个涉及使用 SASfile 并且在内存中没有邻接列表的实现。创建一个空文件并从特定行(对应于特定代理)读取一切顺利,直到“最后”步骤:更新整个观察。

下面是有效的 IML 代码,直到最后一个阶段。

    proc iml;
/* initialize vars*/
checkObs = 2;
numCol = 5;
db = "myTestDataBase";
nObs = 5;
temp = {};
myList = J(1, numCol, 0);
nVarToUpdate = 2;

/* create empty database */
create (db) from myList;
append from myList;
close (db);
do i = 1 to (nObs-1);
edit (db);
append from myList;
close (db);
end;

/* read index checkObs and write to temp*/
edit (db);
read point (checkObs) into temp; /* Read an entire row*/
temp[nVarToUpdate] = 1; /* I would like to update some values*/
/* I want to replace point chekObs with the whole of vector temp*/
replace point checkObs var _all_;
close (db);
print temp;

我的目标是替换/更新整个观察(行),同时保持行的顺序不变。有什么想法吗?

最佳答案

@Joe 的解决方案可以解决这个问题,但是以这种方式结合宏和 IML 就像亲吻你的妹妹:这并不愉快,人们会用奇怪的眼光看你。 Joe 获得变量名称的想法是正确的,但他忘记了 you can use the VALSET call to perform indirect assignment .换句话说,通过拥有变量的名称,您可以更改它的值。

如果你想避免使用宏,你可以一次获取变量的名称(在 EDIT 循环之外),然后遍历变量的名称,如下所示:

/* get column names ONE TIME */
use (db);
read next var _ALL_ into temp[colname=varNames]; /* get names of cols */
close (db);

/* read index checkObs and write to temp*/
edit (db);
read point (checkObs) into temp; /* Read an entire row*/
temp[nVarToUpdate] = 1; /* I would like to update some values*/
do i = 1 to ncol(temp);
call valset(varNames[i], temp[i]); /* update scalar variables */
end;
replace point (checkObs) var _all_;
close (db);

此技术的主要优点是您可以在运行时发现变量名称。

请注意,这种方法(创建变量名称)可能很危险,因为如果数据集有一个名为 X 的变量,您将覆盖程序中任何预先存在的具有该名称的变量。

另请注意,在庞大的数据集上使用 EDIT 和 READ POINT 一次更改一行将比冬天糖蜜流上山要慢。如果可能的话,你应该 read in a big block of data ,对该 block 中的所有行进行操作,并写出该 block 。

如果磁盘空间允许,您可能想尝试使用 SETIN 和 SETOUT 语句来 read from one data set while writing to another .那会完全消除了对 REPLACE 语句和 VALSET 调用的需要。通常,以只读方式打开数据集并按顺序处理它比以读/写方式打开数据集并使用随机访问方式处理效率更高。

关于database - 如何通过 IML 替换处理 SAS 文件的整个观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35289654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com