我想比较矩阵中两行的元素,然后总结数据对的最小值。
例如,在这样的矩阵中,结果应为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循环?
答案 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