3

我有 26 个变量,每个变量都包含从 1 到 61 的数字。我希望每种情况下为 1,每种情况下为 2,等等。新变量中的数字 1。如果没有 1,则变量应包含 2。因此 26 个变量的数据如下:1 15 28 39 46 1 12 等。

我想要 61 个变量:1 2 1 2 2 1 等。

我一直在阅读有关创建向量、循环、执行 if 等的信息,但我找不到正确的编码方式。我所做的只是创建 61 个变量并编写

如果 V1=1 或 V2=1 或(等到 V26),请执行此操作。

重新编码 newV1=1。

万一。

可执行程序。

**对所有 61 个变量重复此操作。

将 newV1 重新编码为 newV61(缺失=2)。

所以这是很多代码,与我想象的相差很大。

谁能帮我解决这个问题?非常感谢您的帮助!

4

3 回答 3

1

这应该这样做:

do repeat NewV=NewV1 to NewV61/vl=1 to 61.
  compute NewV=any(vl,v1 to v26).
end repeat.

说明:此语法将遍历值 1 到 61,每个值都检查变量 v1 到 v26 是否具有该值。如果它们中的任何一个这样做,则正确的 NewV 将收到值 1。如果它们都不这样做,则正确的 NewV 将收到值 0。只要确保 v1 到 v26 在文件中连续排序即可。如果不是,则更改为:

compute NewV=any(vl,v1, v2, v3, v4 ..... v26).
于 2016-07-04T15:30:00.110 回答
1

noumenal 是正确的,你可以用两个循环来做。不过,另一种方法是VECTOR使用原始值访问,将其写入 1,并将所有其他值设置为零。

为了说明,首先我制作了一些名为X1 to X4.

*Fake Data.
SET SEED 10.
INPUT PROGRAM.
LOOP Id = 1 TO 20.
END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
VECTOR X(4,F2.0).
LOOP #i = 1 TO 4.
  COMPUTE X(#i) = TRUNC(RV.UNIFORM(1,62)).
END LOOP.
EXECUTE.

现在这段代码所做的是创建四个向量集以与每个变量一起使用,然后用于DO REPEAT实际引用VECTOR存根。然后结束RECODE- 如果它丢失,它应该被编码为 2。

VECTOR V1_ V2_ V3_ V4_ (61,F1.0).
DO REPEAT orig = X1 TO X4 /V = V1_ V2_ V3_ V4_.
  COMPUTE V(orig) = 1.
END REPEAT.
RECODE V1_1 TO V4_61 (SYSMIS = 2).

这有点痛苦,至于原始的 VECTOR 命令,您需要写出所有存根,但是您可以将其复制粘贴到 DO REPEAT 子命令中(或制作一个宏来为您完成)。


为了更简单的说明,如果我们有我们的原始变量,比如A,它可以取 1 到 61 之间的整数值,并且我们想扩展为 61 个虚拟变量,然后我们将创建一个向量,然后访问其中的位置向量。

VECTOR DummyVec(61,F1.0).
COMPUTE DummyVec(A) = 1.

对于一个记录,如果A = 10,那么这里DummyVec10将等于 1,并且所有其他DummyVec变量仍将默认由系统丢失。无需使用DO IF61 个值。

其余的代码只是额外的,可以一次性完成多个原始变量。

于 2016-07-04T11:51:01.660 回答
0

您需要一个嵌套循环:两个循环 - 一个外部循环和一个内部循环。

于 2016-07-04T09:10:52.077 回答