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として使用apply
しMARGIN
ます
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