deleting rows

Accepted Solution Solved
Reply
Contributor
Posts: 45
Accepted Solution

deleting rows

dataset:

 

subj        drug           week               q1      q2      q3 ... qtotal

1              a                  1                   1         3        4       10

1              a                  2                   1         0        4       0

1              a                  3                   0         3        0       0

1              a                  4                   0         3        4       0

1              a                  5                   0         3        0       0            

2              d                  1                   1         3        1       0

2              d                  2                   1         2        4       0

2              d                  3                   1         3        4       0

2              d                  4                   0         0        0       0

 

I would like to create a new data set where it would delete for each subject all rows except where q1 reaches 0 by the earliest week (for example, for subj 1, all rows should be deleted except for the row with the value 3 in the week variable (since it was the first (earliest) week that q1 turned to 0. For subj 2, again all rows except the row with the value 4 in the week variable should be deleted).

 

new dataset should look like:

subj        drug           week               q1      q2      q3 ... qtotal

1              c                  3                   0         3        0       0

2              d                  4                   0         0        0       0

 

Once I get this dataset, then I would like to delete any rows were the week number is greater than 16

 

 


Accepted Solutions
Solution
‎08-12-2016 12:55 AM
Grand Advisor
Posts: 9,571

Re: deleting rows


That is easy, Just a little modification.




data have;
infile cards truncover;
input subj        drug   $        week               q1      q2      q3  qtotal;
cards;
1              a                  1                   1         3        4       10
1              a                  2                   1         0        4       0
1              a                  3                   0         3        0       0
1              a                  4                   0         3        4       0
1              a                  5                   0         3        0       0            
2              d                  1                   1         3        1       0
2              d                  2                   1         2        4       0
2              d                  3                   1         3        4       0
2              d                  4                   0         0        0       0
3              a                  1                   1    
3              a                  2                   2 
3              a                 16                  4    
4              b                  1                  3   
4              b                  2                  3  
4              b                  3                  1
;
run;
data want;
do i=1 by 1 until(last.subj);
 set have;
 by subj;
 if not found and q1=0 then do;idx=i;found=1;end;
end;

do j=1 by 1 until(last.subj);
 set have;
 by subj;
 if not missing(idx) and idx=j then output;
end;

 if missing(idx) then do;
   q1=1;
   output;
 end;
drop i j found;
run;


View solution in original post


All Replies
Respected Advisor
Posts: 3,825

Re: deleting rows

[ Edited ]

Something like below should do:

data have;
  input subj drug $ week q1 q2 q3 qtotal;
datalines;
1 a 1 1 3 4 10
1 a 2 1 0 4 0
1 a 3 0 3 0 0
1 a 4 0 3 4 0
1 a 5 0 3 0 0 
2 d 1 1 3 1 0
2 d 2 1 2 4 0
2 d 3 1 3 4 0
2 d 4 0 0 0 0
;
run;

proc sort data=have out=inter;
  by subj q1 week;
  where week<=16 and q1=0;
run;

data want;
  set inter;
  by subj q1 week;
  if first.q1 then output;
run;

 

Contributor
Posts: 45

Re: deleting rows

is there any way to keep in the subjects that didn't make it to zero by week 16 and put their q1 value as 1....and if they didnt have a week 16 then to create a week 16 and put a . as the value in q1. (see subj 3 and 4)

 

dataset:

 

subj        drug           week               q1      q2      q3 ... qtotal

1              a                  1                   1         3        4       10

1              a                  2                   1         0        4       0

1              a                  3                   0         3        0       0

1              a                  4                   0         3        4       0

1              a                  16                 0         3        0       0            

2              d                  1                   1         3        1       0

2              d                  2                   1         2        4       0

2              d                  3                   0         3        4       0

2              d                  16                 0         0        0       0

3              a                  1                   1    .......

3              a                  2                   2    .......

3              a                 16                  4     ....... 

4              b                  1                  3      .........

4              b                  2                  3     .........

4              b                  3                  1..........

 

new dataset looks like 

subj        drug           week               q1      q2      q3 ... qtotal

1              a                  3                   0         3        0       0

2              d                  3                   0         3        4       0

3              a                 16                  1     ..........

4              b                 16                  .      ..........

Grand Advisor
Posts: 9,571

Re: deleting rows

That is really not easy.


data have;
infile cards truncover;
input subj        drug   $        week               q1      q2      q3  qtotal;
cards;
1              a                  1                   1         3        4       10
1              a                  2                   1         0        4       0
1              a                  3                   0         3        0       0
1              a                  4                   0         3        4       0
1              a                  5                   0         3        0       0            
2              d                  1                   1         3        1       0
2              d                  2                   1         2        4       0
2              d                  3                   1         3        4       0
2              d                  4                   0         0        0       0
3              a                  1                   1    
3              a                  2                   2 
3              a                 16                  4    
4              b                  1                  3   
4              b                  2                  3  
4              b                  3                  1
;
run;
data want;
do i=1 by 1 until(last.subj);
 set have;
 by subj;
 if not found and q1=0 then do;idx=i;found=1;end;
end;

do j=1 by 1 until(last.subj);
 set have;
 by subj;
 if not missing(idx) and idx=j then output;
end;

 if missing(idx) then do;
   if week=16 then q1=1;
    else do;week=16;q1=.;end;
   output;
 end;
drop i j found;
run;



Contributor
Posts: 45

Re: deleting rows

Hi Xia,

 

Thank you for this: I have another edit to make. Instead of  having to create a 16 for week when there doesn't exist one and put a . for q1 , is there a way to have whatever previous week that has a value and make the q1=1 (see subj 4)

 

dataset:

 

subj        drug           week               q1      q2      q3 ... qtotal

1              a                  1                   1         3        4       10

1              a                  2                   1         0        4       0

1              a                  3                   0         3        0       0

1              a                  4                   0         3        4       0

1              a                  16                 0         3        0       0            

2              d                  1                   1         3        1       0

2              d                  2                   1         2        4       0

2              d                  3                   0         3        4       0

2              d                  16                 0         0        0       0

3              a                  1                   1    .......

3              a                  2                   2    .......

3              a                 16                  4     ....... 

4              b                  1                  3      .........

4              b                  2                  3     .........

4              b                  3                  1..........

5              c                   1                  3

 

new dataset looks like 

subj        drug           week               q1      q2      q3 ... qtotal

1              a                  3                   0         3        0       0

2              d                  3                   0         3        4       0

3              a                 16                  1     ..........

4              b                 16                  .     ..........        so for this row now week will be "3" instead of 16 and q1 will be "1" instead of "."

Solution
‎08-12-2016 12:55 AM
Grand Advisor
Posts: 9,571

Re: deleting rows


That is easy, Just a little modification.




data have;
infile cards truncover;
input subj        drug   $        week               q1      q2      q3  qtotal;
cards;
1              a                  1                   1         3        4       10
1              a                  2                   1         0        4       0
1              a                  3                   0         3        0       0
1              a                  4                   0         3        4       0
1              a                  5                   0         3        0       0            
2              d                  1                   1         3        1       0
2              d                  2                   1         2        4       0
2              d                  3                   1         3        4       0
2              d                  4                   0         0        0       0
3              a                  1                   1    
3              a                  2                   2 
3              a                 16                  4    
4              b                  1                  3   
4              b                  2                  3  
4              b                  3                  1
;
run;
data want;
do i=1 by 1 until(last.subj);
 set have;
 by subj;
 if not found and q1=0 then do;idx=i;found=1;end;
end;

do j=1 by 1 until(last.subj);
 set have;
 by subj;
 if not missing(idx) and idx=j then output;
end;

 if missing(idx) then do;
   q1=1;
   output;
 end;
drop i j found;
run;


Grand Advisor
Posts: 9,571

Re: deleting rows

data have;
input subj        drug   $        week               q1      q2      q3  qtotal;
cards;
1              a                  1                   1         3        4       10
1              a                  2                   1         0        4       0
1              a                  3                   0         3        0       0
1              a                  4                   0         3        4       0
1              a                  5                   0         3        0       0            
2              d                  1                   1         3        1       0
2              d                  2                   1         2        4       0
2              d                  3                   1         3        4       0
2              d                  4                   0         0        0       0
;
run;
data want;
 set have;
 by subj;
 retain found;
 if first.subj then found=0;
 if q1=0 and not found then do;output;found=1;end;
 drop found;
run;


Esteemed Advisor
Posts: 6,646

Re: deleting rows

[ Edited ]

 

proc sort data=have;
by subj week;
run;
/* just to make sure */

data want;
set have (where=(q1 = 0 and week <= 16));
by subj;
if first.subj;
run;

to answer your original question.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

Discussion stats
  • 7 replies
  • 519 views
  • 3 likes
  • 4 in conversation