Data Stepping

Brandon Taylor

2016-08-18

First, import datastepr.

library(datastepr)

The basic idea behind this package was inspired by SAS data steps. In each step, the environment is populated by a slice of data from a data frame. Then, operations are performed. The environment is whole-sale appended to a results data frame. Then, the datastep repeats.

Datastep

Let’s begin with a brief tour of the dataStepClass. First, create an instance.

step = dataStepClass$new()

Please read the dataStepClass documentation before continuing, which is extensive.

?dataStepClass()
## Using development documentation for dataStepClass

Examples

Our example will be Euler’s method for solving differential equations. In fact, it is unimportant if you understand the method itself. The differential equation to be solved is given below: \[ \dfrac{dy}{dx} = xy \]

First, we will set initial values. The x values are the series of x values over which the method will be applied.

xFrame = data.frame(x = 0:9)

Our initial y value will only be for the first iteration of the data-step.

y_initial = data.frame(y = 1)

Now here is our stair function. First, begin is called, setting up an evaluation environment in the function’s environment(). Next, only in the first step, initialize y. Note, importantly, that without another set call later (or a manual override of continue), the data step would only run once. A lag of x is stored in all but the first step. This is important, because after the set call, x is overwritten using a slice of the dataframe above. Then, a new y is estimated using the new x, the lag of x, and the derivative estimate (in all but the first step). Next, a derivative is estimated (see equation above). Finally, we output the results.

stairs = function(...) {
  step$begin(environment())

  if (step$i == 1) step$set(y_initial)

  if (step$i > 1) lagx = x

  step$set(xFrame)
  
  if (step$i > 1) y = y + dydx*(x - lagx)
 
  dydx = x*y
  
  step$output()
  
  step$end(stairs)
}

stairs()

Let’s take a look at our results!

knitr::kable(step$results)
dydx x y lagx
0 0 1 NA
1 1 1 0
4 2 2 1
18 3 6 2
96 4 24 3
600 5 120 4
4320 6 720 5
35280 7 5040 6
322560 8 40320 7
3265920 9 362880 8