turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

- JMP User Community
- :
- Discussions
- :
- Discussions
- :
- Compare Rows by Group

Topic Options

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Feb 7, 2016 5:27 PM
(1460 views)

Hi,

I'm trying to write a script comparing rows by group but am having trouble figuring out how to do this In the table below, I'm trying to select rows that meet both of the following conditions within a group (i.e. by "Subject Number" column):

- Value in "Target # Days from Previous" column is greater than the row with a value of zero (in example below highlighted rows 71 through 82 have values greater than value for row 83)
- Value in "Visit Sequence" column is less than the value in this column for the row where "Target # Days from Previous" is equal to zero (in example below highlighted rows 71 though 82 have values less than value for row 83)

Basically I'm trying to compare rows within a group with another row within the same group and do this for the entire table. Does anyone know how I can do this?

Thanks,

Christine

Solved! Go to Solution.

1 ACCEPTED SOLUTION

Accepted Solutions

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Feb 8, 2016 4:34 AM
(1410 views)

Solution

Christine,

Here is a script that does what you are asking for. I tested it on the small snippet of data you provided, and it appears to accomplish what you want.

Names Default To Here( 1 );

dt = Current Data Table();

// Create a New column to track found groups

dt << New Column( "Grouping", set each value( . ) );

countGroup = 0;

// Step through all data

For( i = 1, i <= N Rows( dt ) - 1, i++,

// Look ahead to see if triger criteria has been met

// and if it has, then read backwards until it fails

If( dt:Name( "Target # Days from Previous" )* *> dt:Name( "Target # Days from Previous" )[i + 1] & dt:Visit Sequence* *< dt :Visit Sequence[i + 1],

// Trigger has been found, so read backwards until not true

countGroup++;

compareStart = i;

While( dt:Name( "Target # Days from Previous" )[compareStart] > dt:Name( "Target # Days from Previous" )[i + 1] & dt:Visit Sequence[ compareStart] < dt:Visit Sequence[i + 1],

dt:Grouping[compareStart] = countGroup;

Selected( Row State( compareStart ) ) = 1;

compareStart--;

);

)

);

Jim

2 REPLIES

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Feb 8, 2016 4:33 AM
(1365 views)

Not sure I have understood what you are looking for.

Can 'Target # Days from Previous' be an integer less than zero? If not, then don't all rows for a given subject apart from one satisfy your first condition?

Maybe you can post a table with the three columns you need to manipulate (Subject, Target and Visit Sequence? Use the 'Advanced Editor' then 'Attach'.

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Feb 8, 2016 4:34 AM
(1411 views)

Christine,

Here is a script that does what you are asking for. I tested it on the small snippet of data you provided, and it appears to accomplish what you want.

Names Default To Here( 1 );

dt = Current Data Table();

// Create a New column to track found groups

dt << New Column( "Grouping", set each value( . ) );

countGroup = 0;

// Step through all data

For( i = 1, i <= N Rows( dt ) - 1, i++,

// Look ahead to see if triger criteria has been met

// and if it has, then read backwards until it fails

If( dt:Name( "Target # Days from Previous" )* *> dt:Name( "Target # Days from Previous" )[i + 1] & dt:Visit Sequence* *< dt :Visit Sequence[i + 1],

// Trigger has been found, so read backwards until not true

countGroup++;

compareStart = i;

While( dt:Name( "Target # Days from Previous" )[compareStart] > dt:Name( "Target # Days from Previous" )[i + 1] & dt:Visit Sequence[ compareStart] < dt:Visit Sequence[i + 1],

dt:Grouping[compareStart] = countGroup;

Selected( Row State( compareStart ) ) = 1;

compareStart--;

);

)

);

Jim