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

可能的答案之一:

# 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 回答