Solved
Contributor
Posts: 45

# 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
Super User
Posts: 10,766

## 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;
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;

```

All Replies
Posts: 4,736

## 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                  .      ..........

Super User
Posts: 10,766

## 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;
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
Super User
Posts: 10,766

## 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;
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;

```
Super User
Posts: 10,766

## 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;
drop found;
run;

```
Super User
Posts: 10,214

## 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;``````

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
How to convert datasets to data steps
How to post code
☑ This topic is solved.