I am implementing a statistical method from an academic paper (see the end for a citation) in R. I think there's a way to do one of the steps without using a loop, but I'm having trouble deciding how to attack it.

This method operates on a data frame with three variables: x, n, and p. It can only operate if p[i] <= p[i+1] for all i. If a pair of points violates that, they are smoothed out by setting both p[i] and p[i+1] equal to their weighted average 
 (n[i]\*p[i]+n[i+1]\*p[i+1])/(n[i]+n[i+1])
This smoothing is iterated until the p\_i are a nondecreasing sequence.

The problem with this smooth is that a) loops are bad form in R, and b) if there are multiple points in a row such that p\_i > p\_(i+1) >= p\_(i+2), the method can fail to terminate or take a very long time to converge. For instance, if a sequence like so happens:

```
x  n  p
2  10 0.6
5  10 0.5
10 10 0.5

```

the smooth will set the first two values of p to 0.55, then the second two to 0.525, then set the first two to 0.5325, and so on and loop forever (or if I'm lucky reach the limit of significance in a bajillion iterations). There should be a mathematically equivalent but more efficient way to do this by identifying adjacent decreasing data points and averaging them as a group, but I'm not sure how to approach that in R.

If you need more background, the paper in question is [Martin A. Hamilton, Rosemarie C. Russo, Robert V. Thurston.
"Trimmed Spearman-Karber method for estimating median lethal concentrations in toxicity bioassays." Environ. Sci. Technol., 1977, 11 (7), pp 714–719](http://www.math.montana.edu/~jimrc/classes/stat524/notes/TrimmedSpearmanKarber.pdf). I'm referring to the "first step" section on page 716.