2011-09-26 72 views
0

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

例如,在这样的基体中的结果应该是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循环?

回答

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> 
+0

谢谢,它工作正常。我以为我以前曾尝试过... – Christian

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 
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 
+0

谢谢,这有助于很多。我一直在试图弄清楚如何从R中的循环中返回值一段时间。 – Christian