Not sure if I understood your question, but maybe a "split-apply-combine" approach will work:
positionList <- data.frame(instrument=c("A", "B", "C", "A", "B", "C", "A", "B", "C"), runtotal=c(1,1,1,2,0,3,3,-1,4), stringsAsFactors=FALSE)
sp <- split(positionList, positionList$instrument)
fun <- function(dat) {
if(nrow(dat)>1)
dat[nrow(dat),"runtotal"] - dat[nrow(dat)-1, "runtotal"]
else
NA
}
app <- lapply(sp, FUN=fun)
res <- do.call(rbind, app)
Now res
should contain the last change of the running total.