cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
  • JMP 19 is here! See the new features at jmp.com/new.
  • Due to global connectivity issues impacting AWS Services, users may experience unexpected errors while attempting to authorize JMP. Please try again later or contact support@jmp.com to be notified once all issues are resolved.

Discussions

Solve problems, and share tips and tricks with other JMP users.
Choose Language Hide Translation Bar
RVhydrA
Level III

Add values into X number of lag rows

I have a continuous dataset with measurements every 5 minutes over many years. Certain time periods have been designated and assigned and ID# (e.g. 1, 2, 3,... 500). For each of these periods of time that received an ID I want to extend the column ID backwards in time for 4 hours (ie 48 rows back). So for example If the period categorized as ID# 200 starts on 1/1/2020 at 12:00PM, then I currently have empty cells in the previous 48 rows leading up to that timestamp. I want to fill those rows (1/1/2020 8:00AM - 1/1/2020 11:55AM) with the ID value of 200. I figured there is some sort of indexing (row i - lag row i-48) way to do this but not sure how to execute that. There is a very very clunky way to execute this using a ton of if,then statements but i'm trying to avoid that because i'd need 48 of those to make this work and the formula would be ridiculous.

1 ACCEPTED SOLUTION

Accepted Solutions
txnelson
Super User

Re: Add values into X number of lag rows

Here is a simple script that when it finds an ID#, it populates the previous 48 rows with the current value of ID#

Names Default To Here( 1 );

// Create a table with ID# every 49 rows
dt = New Table( "Example",
	add rows( 490 ),
	New Column( "ID#",
		character,
		formula(
			x = "";
			If( Mod( Row(), 49 ) == 0,
				x = Char( Row() / 49 * 100 )
			);
			x;
		)
	)
);
dt << rerun formulas;
dt:ID# << delete formula;

// Observe the data table for 5 seconds
Wait( 5 );

// Pass across the data table, and when an ID# is found,
// Populate the previous 48 columns
For( i = 49, i <= N Rows( dt ), i++,
	If( :ID#[i] != "",
		:ID#[(i - 48) :: (i - 1) ] = :ID#[i]
	)
);
Jim

View solution in original post

2 REPLIES 2
jthi
Super User

Re: Add values into X number of lag rows

I think it possible to do it with Lag() but I went this time without by using rounding to closest 48. Maybe something like this would work:

dt = New Table("Untitled",
	Add Rows(192),
	Compress File When Saved(1),
	New Column("time",
		Numeric,
		"Continuous",
		Format("Best", 12),
		Set Values(
			[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
			21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
			39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
			57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
			75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
			93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108,
			109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
			123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
			137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
			151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
			165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178,
			179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192]
		)
	),
	New Column("id",
		Numeric,
		"Continuous",
		Format("Best", 12),
		Set Values(
			[., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., .,
			., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., 1,
			., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., .,
			., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., 2,
			., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., .,
			., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., 2,
			., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., .,
			., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., 3]
		),
		Set Display Width(47)
	)
);

tempcol = dt << New column("formula", 
	Formula(
		If(IsMissing(:id),
			:id[Ceiling(Row()/48)*48], //Ceiling rounding to closest 48 and get value from :id
			:id
		);
	);
);
-Jarmo
txnelson
Super User

Re: Add values into X number of lag rows

Here is a simple script that when it finds an ID#, it populates the previous 48 rows with the current value of ID#

Names Default To Here( 1 );

// Create a table with ID# every 49 rows
dt = New Table( "Example",
	add rows( 490 ),
	New Column( "ID#",
		character,
		formula(
			x = "";
			If( Mod( Row(), 49 ) == 0,
				x = Char( Row() / 49 * 100 )
			);
			x;
		)
	)
);
dt << rerun formulas;
dt:ID# << delete formula;

// Observe the data table for 5 seconds
Wait( 5 );

// Pass across the data table, and when an ID# is found,
// Populate the previous 48 columns
For( i = 49, i <= N Rows( dt ), i++,
	If( :ID#[i] != "",
		:ID#[(i - 48) :: (i - 1) ] = :ID#[i]
	)
);
Jim

Recommended Articles