Суммируем минимумы пар данных в матрице - PullRequest
0 голосов
/ 26 сентября 2011

Я хотел бы сравнить элементы двух строк в матрице, а затем суммировать минимумы пар данных.

Например, в такой матрице результат должен быть 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 ]

1 голос
/ 26 сентября 2011

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
1 голос
/ 26 сентября 2011

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 голосов
/ 26 сентября 2011

Более "R" способ решить эту задачу - применить функцию: sum(apply(m, 2, min))

Ваш цикл 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...