8

次の形式のさまざまな数の列を持つマトリックスがあります。

1  10  10 10 15
2  14  14 13 13
4  19  19 20 21
6  32  32 20 15

次の出力を生成する各行の過半数を選択したいと思います。

1  10
2  14/13
3  19
4  32
4

3 に答える 3

12

必要なものはほとんど得られるように見えtableましたが、出力をマッサージする必要があります。 Composeこれを行う興味深い方法です:

require(functional)
apply(m, 1, Compose(table,
                    function(i) i==max(i),
                    which,
                    names,
                    function(i) paste0(i, collapse='/')
                    )
      )

## [1] "10"    "13/14" "19"    "32"   
于 2013-01-01T20:55:56.857 に答える
9

考えられる答えの 1 つ:

# over each row of data.frame (or matrix)
sapply(1:nrow(x), function(idx) {
# get the number of time each entry in df occurs
    t <- table(t(x[idx, ]))
# get the maximum count (or frequency)
    t.max <- max(t)
# get all values that equate to maximum count
    t <- as.numeric(names(t[t == t.max]))
})
于 2013-01-01T20:48:57.260 に答える
4

遅い追加ですが、例のように値がすべて正の場合、次のこともできます。

apply(x, 1, function(idx) {
     which(tabulate(idx) == max(tabulate(idx)))
     })

最初の列なし:

 apply(x[,-1], 1, function(idx) {
     which(tabulate(idx) == max(tabulate(idx)))
     })

最後に出力を微調整します。

s <- apply(x[,-1], 1, function(idx) {
     which(tabulate(idx) == max(tabulate(idx)))
     })
sapply(s, paste, sep="", collapse="/")

[1] "10"    "13/14" "19"    "32"   
于 2013-01-02T01:27:38.970 に答える