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

の列全体で過半数の票を獲得したいと思いますmymat。この例では、5つの列にわたる多数決の結果は次のとおり1 -1 -1 1 1です。

ここで同様の質問の解決策を調べてみましたが、の列にmymat名前が付いていないため、これらの解決策は機能しませんでした。

回答

akrun Aug 17 2020 at 22:41

ここModeから機能が使えます

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

関数を列方向に適用するために2として使用applyMARGINます

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

またはを使用して asplit/sapply

sapply(asplit(mymat, 2), Mode)

注:どちらのソリューションも、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

あなたがサンプルデータによって表されるタイプのバイナリ投票を持っている場合は、使用することができますsign()colSums()

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