1
mymat <- structure(c(1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, -1
), .Dim = c(3L, 5L))

> mymat
     [,1] [,2] [,3] [,4] [,5]
[1,]    1   -1   -1    1    1
[2,]    1   -1    1    1    1
[3,]    1   -1   -1    1   -1

I want to take the majority vote across the columns of mymat. In this example, the majority vote results across the 5 columns are: 1 -1 -1 1 1.

I've tried looking at the solutions from a similar question here, but since the columns in mymat are unnamed, these solutions did not work for me.

Adrian
  • 9,229
  • 24
  • 74
  • 132

2 Answers2

1

If you have binary voting of the type represented by your sample data you can use sign() and colSums():

sign(colSums(mymat))
[1]  1 -1 -1  1  1
Ritchie Sacramento
  • 29,890
  • 4
  • 48
  • 56
0

We can use Mode function from here

Mode <- function(x) {
   ux <- unique(x)
   ux[which.max(tabulate(match(x, ux)))]
 }

and use apply with MARGIN as 2 for columnwise application of the function

apply(mymat, 2, Mode)
#[1]  1 -1 -1  1  1

Or using asplit/sapply

sapply(asplit(mymat, 2), Mode)

NOTE: Both the solutions work on a general dataset and not just based on the values showed by the OP

mymat2 <- cbind(c('A', 'B', 'A'), c('e', 'e', 'f'))
sapply(asplit(mymat2, 2), Mode)
akrun
  • 874,273
  • 37
  • 540
  • 662