总结矩阵中数据对的最小值

时间:2011-09-26 13:37:25

标签: r

我想比较矩阵中两行的元素,然后总结数据对的最小值。

例如,在这样的矩阵中,结果应为3(1 + 1 + 1 + 0)

> m
  col1 col2 col3 col4
a    2    1    4    4
b    1    2    1    0

我试过这样:

> findmin <- function (x) for (i in 1:ncol(x)) {min(x[1,i], x[2,i])}
> res <- sum(findmin(m))
> res
[1] 0

我认为问题是循环返回NULL作为值。我怎么能避免这个?或者是否有更优雅的方法来避免for循环?

3 个答案:

答案 0 :(得分:1)

apply()是你的朋友:

R> M <- matrix(c(2,1,4,4,1,2,1,0), 2, 4, byrow=TRUE)
R> M
     [,1] [,2] [,3] [,4]
[1,]    2    1    4    4
[2,]    1    2    1    0
R> apply(M, 1, min)                       # goes row-wise
[1] 1 0
R> apply(M, 2, min)                       # goes column-wise
[1] 1 1 1 0
R> sum(apply(M, 2, min))
[1] 3
R> 

答案 1 :(得分:1)

sum(apply(m, 2, min))可以解决问题:

> m <- matrix(c(2,1,4,4,1,2,1,0), 2, byrow=TRUE)

> m
     [,1] [,2] [,3] [,4]
[1,]    2    1    4    4
[2,]    1    2    1    0

> sum(apply(m, 2, min))
[1] 3

答案 2 :(得分:0)

解决此任务的更“R”方式是使用应用函数:sum(apply(m, 2, min))

你的for循环不起作用,因为你没有存储或返回任何值。以下是修复for循环的方法。请注意,预先分配out的大小会使其执行得更快:

findmin <- function(x){
    out <- rep(NA, ncol(x))
    for (i in 1:ncol(x)) {
        out[i] <- min(x[1,i], x[2,i])
    }
    return(out)
}
> findmin(m)
[1] 1 1 1 0