[R] how to rewrite this without a loop ?

Thomas Lumley tlumley at u.washington.edu
Thu Nov 18 17:13:48 CET 2004

On Thu, 18 Nov 2004, Stijn Lievens wrote:
> <code>
> add.fun <- function(perf.data) {
>   ss <- 0
>   for (i in 0:29) {
>   	ss <- ss + cor(subset(perf.data, dataset == i)[3], subset(perf.data, 
> dataset == i)[7], method = "kendall")
>   }
>   ss	}
> </code>
> As one can see this function uses a for-loop.  Now chapter 9 of 'An 
> introduction to R' tells us that we should avoid for-loops as much as 
> possible.

You don't say whether `dataset' is the name of a column in `perf.data'. 
Assuming it is, and assuming that 0:29 are all the values of `dataset'

sum(by(perf.data, list(perf.data$dataset),
           function(d)  cor(d[,3],d[,7], method="kendall")))

would work.  If this is faster it will be because you don't call subset() 
twice per iteration, rather than because you are avoiding a loop.  However 
it has other benefits: it doesn't have the variable `i', it doesn't have 
to change the value of `ss', and it doesn't have the range of `dataset' 
hard-coded into it.  These are all clarity optimisations.


More information about the R-help mailing list