在 SAS 中创建重复行并更改变量值

Create duplicate rows in SAS and change values of variables

我一直很困惑如何在 SAS 中实现它。如果“2”的值在变量 (member1 -member4) 之间出现不止一次,我将尝试创建重复行。例如,如果某行在 member2、member3 和 member4 中的值为 2,那么我将创建 2 个重复行,因为初始行将用于第一个变量,而重复行将用于成员 3 和 4。在重复项上例如,member3 的行,如果成员 2 和 4 的值等于 2,则成员 2 和 4 将丢失。基本上,值“2”每行只能出现一次。假设 sa1 到 sa4 分别对应于 member1 到 member4 的其他变量。当我们为每个成员创建一个重复行时,如果其他变量的值为“1”,则它们应该缺失。例如,如果重复行用于成员 3,则 sa1、sa2 和 sa4 的等于“1”的值应设置为缺失。数据集中还有其他变量,所有重复行的值都与初始行相同。重复的行也将具有 ID 的后缀以指示父行。

这是我的数据示例

id  member1 member2 member3 member4 sa1 sa2  sa3  sa4
 1     0      2       2       0      0   1    1    0
 2     2      2       0       5      .   1    0    0
 3     2      2       3       2      1   1    0    1

那么这就是我想要实现的输出

id  member1 member2 member3 member4 sa1 sa2  sa3  sa4
 1     0      2       .       0      0   1    .    0
 1_1   0      .       2       0      0   .    1    0
 2     2      .       0       5      .   .    0    0
 2_1   .      2       0       5      .   1    0    0
 3     2      .       3       .      1   .    0    .
 3_1   .      2       3       .      .   1    0    .
 3_2   .     .        3       2      .   .    0     1

将不胜感激任何帮助。谢谢!

我认为您希望我们为您编写整个代码...我没有得到您对您想要的内容的逻辑解释 - 但首先要说的是:

  1. 创建新数据集

  2. 重命名所有变量 - 前缀为 O_(原始)

  3. 代码但是你想看看有多少值包含 2 (HOWMANYTWOS)

  4. 做 ROW = 1 到 HOWMANYTWOS

4.1 再次检查您拥有的 O_ 变量的值

4.2 如果 ROW - 对应于您增加的计数器,它是您希望保留的 2,所以您不要触摸它 - 如果 2 不对应于您的 ROW - 制作它。

4.3 输出带有新(如果需要)ID 的记录

你的开始:

data NEW;
    set ORIG (rename=(MEMBER1-MEMBER4=O_MEMBER1-O_MEMBER4 ID=O_ID etc..)
    HOWMANYTWOS = sum(O_MEMBER1=2,O_MEMBER2=2,O_MEMBER3=2,O_MEMBER4=2);
    do ROW = 1 to HOWMANYTWOS; /* This is stepping through and creating the new rows -  you need to step through the variables to see if you want to make them null before outputting... NOTE do not change O_ variables only create/update the variables going to the output dataset (The O_ version is for checking against only)
       ID = ifc(ROW = 1, O_ID, catx("_", O_ID, ROW);
       /* create a counter 
       output;
    end;
run;

抱歉 - 此处没有 sas,已经有一段时间了

您需要计算“2”的个数。您还需要记住它们曾经在哪里。 “为了好运,我去除了斑点,但我记得以前斑点在哪里。”

data have ;
  input id :. member1 member2 member3 member4 sa1 sa2  sa3  sa4 ;
cards;
 1 0 2 2 0 0 1 1 0
 2 2 2 0 5 . 1 0 0
 3 2 2 3 2 1 1 0 1
 4 2 0 0 0 . . . .
 5 0 0 0 0 . . . . 
;

data want ;
  set have ;
  array m member1-member4 ;
  array x [4] _temporary_;
  do index=1 to dim(m);
    x[index]=m[index]=2;
  end;
  n2 = sum(of x[*]);
  if n2<2 then output;
  else do counter=1 to n2;
    id=scan(id,1,'_');
    if counter > 1 then id=catx('_',id,counter-1);
    counter2=0;
    do index=1 to dim(m);
       if x[index] then do;
          counter2+1;
          if counter = counter2 then m[index]=2;
          else m[index]=.;
       end;
    end;
    output;
  end;
  drop index n2 counter counter2;
run;

结果

Obs    id     member1    member2    member3    member4    sa1    sa2    sa3    sa4

 1     1         0          2          .          0        0      1      1      0
 2     1_1       0          .          2          0        0      1      1      0
 3     2         2          .          0          5        .      1      0      0
 4     2_1       .          2          0          5        .      1      0      0
 5     3         2          .          3          .        1      1      0      1
 6     3_1       .          2          3          .        1      1      0      1
 7     3_2       .          .          3          2        1      1      0      1
 8     4         2          0          0          0        .      .      .      .
 9     5         0          0          0          0        .      .      .      .