[R] choosing best 'match' for given factor

Murali.Menon at avivainvestors.com Murali.Menon at avivainvestors.com
Fri Apr 1 16:35:10 CEST 2011

```Interesting variety of solutions! Thanks very much.

Murali

-----Original Message-----
From: Henrique Dallazuanna [mailto:wwwhsd at gmail.com]
Sent: 31 March 2011 18:26
To: Menon Murali
Cc: r-help at r-project.org
Subject: Re: [R] choosing best 'match' for given factor

Try this:

bestMatch <- function(search, match) {
colnames(match)[pmax(apply(match[,search], 2, which.max) - 1, 1)]
}

On Thu, Mar 31, 2011 at 11:46 AM,  <Murali.Menon at avivainvestors.com> wrote:
> Folks,
>
> I have a 'matching' matrix between variables A, X, L, O:
>
>> a <- structure(c(1, 0.41, 0.58, 0.75, 0.41, 1, 0.6, 0.86, 0.58,
> 0.6, 1, 0.83, 0.75, 0.86, 0.83, 1), .Dim = c(4L, 4L), .Dimnames = list(
>    c("A", "X", "L", "O"), c("A", "X", "L", "O")))
>
>> a
>      A     X     L     O
> A  1.00  0.41  0.58  0.75
> X  0.41  1.00  0.60  0.86
> L  0.58  0.75  1.00  0.83
> O  0.60  0.86  0.83  1.00
>
> And I have a search vector of variables
>
>> v <- c("X", "O")
>
> I want to write a function bestMatch(searchvector, matchMat) such that for each variable in searchvector, I get the variable that it has the highest match to - but searching only among variables to the left of it in the 'matching' matrix, and not matching with any variable in searchvector itself.
>
> So in the above example, although "X" has the highest match (0.86) with "O", I can't choose "O" as it's to the right of X (and also because "O" is in the searchvector v already); I'll have to choose "A".
>
> For "O", I will choose "L", the variable it's best matched with - as it can't match "X" already in the search vector.
>
> My function bestMatch(v, a) will then return c("A", "L")
>
> My matrix a is quite large, and I have a long list of search vectors v, so I need an efficient method.
>
> I wrote this:
>
> bestMatch <- function(searchvector,  matchMat) {
>        sapply(searchvector, function(cc) {
>                             y <- matchMat[!(rownames(matchMat) %in% searchvector) & (index(rownames(matchMat)) < match(cc, rownames(matchMat))), cc, drop = FALSE];
>                             rownames(y)[which.max(y)]
>        })
> }
>
>
> Thanks,
>
> Murali
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

--
Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40" S 49° 16' 22" O

```