An immutable data frame works like an ordinary data frame, except that when you subset it, it returns a reference to the original data frame, not a a copy. This makes subsetting substantially faster and has a big impact when you are working with large datasets with many groups.
Details
This method is still a little experimental, so please let me know if you run into any problems.
Examples
system.time(dlply(baseball, "id", nrow))
#> user system elapsed
#> 0.078 0.000 0.077
system.time(dlply(idata.frame(baseball), "id", nrow))
#> user system elapsed
#> 0.072 0.000 0.072