Prendre le vote majoritaire dans les colonnes de la matrice dans R

Aug 17 2020
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

Je veux faire passer le vote majoritaire dans les colonnes de mymat. Dans cet exemple, les résultats du vote à la majorité sur les 5 colonnes sont: 1 -1 -1 1 1.

J'ai essayé d'examiner les solutions à partir d'une question similaire ici , mais comme les colonnes ne mymatsont pas nommées, ces solutions n'ont pas fonctionné pour moi.

Réponses

akrun Aug 17 2020 at 22:41

Nous pouvons utiliser la Modefonction d' ici

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

et utiliser applyavec MARGINas 2 pour une application par colonne de la fonction

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

Ou en utilisant asplit/sapply

sapply(asplit(mymat, 2), Mode)

REMARQUE: les deux solutions fonctionnent sur un ensemble de données général et pas seulement sur les valeurs affichées par l'OP

mymat2 <- cbind(c('A', 'B', 'A'), c('e', 'e', 'f'))
sapply(asplit(mymat2, 2), Mode)
1 27ϕ9 Aug 17 2020 at 22:50

Si vous avez un vote binaire du type représenté par vos exemples de données, vous pouvez utiliser sign()et colSums():

sign(colSums(mymat))
[1]  1 -1 -1  1  1