Skip to content

looking for 'tied rows' in dataframe

5 messages · Evan Cooch, Ben Tupper

#
Suppose I have the following sort of structure:

test <- matrix(c(2,1,1,2,2,2),3,2,byrow=T)

What I need to be able to do is (i) find the maximum value for each row, 
(ii) find the column containing the max, but (iii) if the maximum value 
is a tie (in this case, all numbers of the row are the same value), then 
I want which.max (presumably, a tweaked version of what which.max does) 
to reurn a T for the row where all values are the same.

Parts (i) and (ii) seem easy enough:

apply(test,1,max)? --- gives me the maximum values
apply(test,1,which.max) --- gives me the column

But, standard which.max doesn't handles ties/duplicates in a way that 
serves my need. It defaults to returning the first column containing the 
maximum value.

What I'd like to end up with is, ultimately, something where 
apply(test,1,which.max) yields 1,2,T? (rather than 1,2,1).

So, a function which does what which.max currently does if the elements 
of the row differ, but which returns a T (or some such) if in fact the 
row values are all the same.

I've tried a bunch of things, to know avail. Closest I got was to use a 
function to test for whether or not a vector

isUnique <- function(vector){
 ???????????????? return(!any(duplicated(vector)))
 ??????????? }

which returns TRUE if values of vector all unique. So

apply(test,1,isUnique)

returns

[1]? TRUE? TRUE FALSE

but I'm stuck beyond this.? Suggestions/pointers to the obvious welcome.

Thanks in advance.
#
Got relatively close - below:
On 3/17/2019 7:39 PM, Evan Cooch wrote:
The following gets me pretty close,

test_new <- test
test_new[which(apply(test,1,isUnique)==FALSE),] <- 'T'

but is clunky.
#
Solved --

hold=apply(test,1,which.max)
 ??? hold[apply(test,1,isUnique)==FALSE] <- 'T'

Now, all I need to do is figure out how to get <- 'T' from turning 
everything in the matrix to a string.
On 3/17/2019 8:00 PM, Evan Cooch wrote:
#
Hi,

Might you replaced 'T' with a numeric value that signals the TRUE case without rumpling your matrix?  0 might be a good choice as it is never an index for a 1-based indexing system.

hold=apply(test,1,which.max)
hold[apply(test,1,isUnique)==FALSE] <- 0
hold
[1] 1 2 0
Ben Tupper
Bigelow Laboratory for Ocean Sciences
60 Bigelow Drive, P.O. Box 380
East Boothbay, Maine 04544
http://www.bigelow.org

Ecological Forecasting: https://eco.bigelow.org/
1 day later
#
Good suggestion, and for my purposes, will solve the problem. Thanks!
On 3/18/2019 12:37 PM, Ben Tupper wrote: