[R] pairwise difference operator

Adaikalavan Ramasamy ramasamy at cancer.org.uk
Mon Aug 2 19:48:22 CEST 2004


Gabor, thank you. This is very helpful.

On Mon, 2004-08-02 at 18:10, Gabor Grothendieck wrote:
> Adaikalavan Ramasamy <ramasamy <at> cancer.org.uk> writes:
> 
> : 
> : Thank you to Marc Schwartz and Gabor Grothendieck for their responses.
> : Both solutions are useful.
> : 
> : It would be nice to generalise this problem to situations where other
> : operations besides difference. Maybe a new member of apply family -
> : pwapply for pairwise apply ? 
> : 
> : Of course the output would be different if the results of an operation
> : on two columns produce a vector (like pairwise difference here) or a
> : single value (like in correlation or pairwise t-test) and one need to
> : somehow account for this.
> 
> Since the general case would involve columns or array slices between
> two not necessarily identical arrays I think the general case is really
> just a sort of generalized inner product.
> 
> In the case that the generalized difference is a scalar its usually called 
> a product and the Euclidean inner product is the most common and takes 
> the form of matrix multiplication which can be done in the one of 
> the following ways:
> 
> 	res1 <- t(mat) %*% mat
> 	res2 <- crossprod(mat, mat)
> 	res3 <- crossprod(mat)
> 
> A generalized inner product, f, replacing the Euclidean one can be
> obtained using a double apply like this:
> 
> 	res4 <- apply(mat, 2, function(a) apply(mat, 2, function(b) sum(a*b)))
> 
> where sum(a*b) can be replaced by f(a,b) for a general inner product
> function.  This actually works even if f returns a vector or other
> array; however, you may need to reshape the result in that case.
> 
> In  the above cases the two matrices were the same but, as mentioned,
> they need not be and you can't count on symmetry between f(a,b) and
> f(b,a).   If your two matrices are the saame and  you can count on
> symmetry then you may want only the lower triangular part and in
> that case you can use lower.tri like this:
> 
> 	res4[lower.tri(res4)]
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>




More information about the R-help mailing list