在 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
将不胜感激任何帮助。谢谢!
我认为您希望我们为您编写整个代码...我没有得到您对您想要的内容的逻辑解释 - 但首先要说的是:
创建新数据集
重命名所有变量 - 前缀为 O_(原始)
代码但是你想看看有多少值包含 2 (HOWMANYTWOS)
做 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 . . . .
我一直很困惑如何在 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
将不胜感激任何帮助。谢谢!
我认为您希望我们为您编写整个代码...我没有得到您对您想要的内容的逻辑解释 - 但首先要说的是:
创建新数据集
重命名所有变量 - 前缀为 O_(原始)
代码但是你想看看有多少值包含 2 (HOWMANYTWOS)
做 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 . . . .