Петли в R и альтернативы - PullRequest
3 голосов
/ 28 июля 2011

У меня есть матрица (1051 * 1051), у которой 0 нулей по диагонали и значения больше 0 нулей повсюду. Цель состоит в том, чтобы условно переназначить некоторые значения в матрице. Например, я хотел бы реализовать следующие критерии: если какой-либо элемент больше, скажем, 400, то этому элементу строки / столбца будет присвоено значение 0, равное нулю.

Вот как сейчас настраивается мой код:

dl <- 400       # condition

for( i in 1:dim(DIST)[1] ) {
    for( j in 1:dim(DIST)[1] ) {
        if( DIST[i,j] > dl ) {
             DIS[i,j] <- 0
        }
    }
}

DIST - исходная матрица (1051 * 1051).

DIS является копией DIST и подлежит редактированию.

Мой вопрос: Есть ли другой способ сделать это? Более быстрый способ?

Я читал, что циклов в R следует избегать. Если у кого есть более эффективный способ, пожалуйста, поделитесь.

Спасибо.

Ответы [ 3 ]

9 голосов
/ 28 июля 2011

Просто используйте назначение []:

DIST[DIST>400] <- 0

См. ?'[', как это работает.Ключ в том, что DIST>400 создает логический вектор длины length(DIST) (количество элементов в DIST), состоящий из ИСТИНЫ, если элемент> 400 и ЛОЖЬ в противном случае.Затем этот вектор используется для подмножества матрицы, и только выделенные элементы присваиваются.

6 голосов
/ 28 июля 2011

Попробуйте

DIS[DIST > d1] <- 0

Полный пример:

n <- 10
d1 <- 400
DIST <- matrix(as.integer(runif(n^2)*1e4), n, n)
DIS <- DIST
DIS[DIST > d1] <- 0
4 голосов
/ 28 июля 2011

Ниже приведен пример обработки матрицы как вектора и использования функций row() и col() для возврата соответствующих строк и столбцов записей, превышающих условие.

Сначала создайте несколько фиктивных данных:

set.seed(1)
m <- matrix(runif(25), ncol = 5)
diag(m) <- 0

Затем мы используем row() и col() для возврата матрицы с индексом строки или столбца для каждой записи в матрице.

mr <- row(m)
mc <- col(m)

mr выглядит следующим образом, например:

> mr
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    2    2    2    2    2
[3,]    3    3    3    3    3
[4,]    4    4    4    4    4
[5,]    5    5    5    5    5

Теперь мы устанавливаем значение условия и выбираем те ячейки m, которые превышают условие:

cond <- 0.95
want <- which(m > cond)

Имея эти ячейки, которые превышают условие, мы извлекаем уникальные индексы строк и столбцов для этих ячеек

rwant <- unique(mr[want])
cwant <- unique(mc[want])

. Эти строки и столбцы вы хотите установить на 0.

Здесь мы делаем этоустановка на ноль, первое копирование m в m2 для сравнения:

m2 <- m
m2[rwant, ] <- 0
m2[, cwant] <- 0

Вот две матрицы:

> m
          [,1]       [,2]      [,3]      [,4]      [,5]
[1,] 0.0000000 0.89838968 0.2059746 0.4976992 0.9347052
[2,] 0.3721239 0.00000000 0.1765568 0.7176185 0.2121425
[3,] 0.5728534 0.66079779 0.0000000 0.9919061 0.6516738
[4,] 0.9082078 0.62911404 0.3841037 0.0000000 0.1255551
[5,] 0.2016819 0.06178627 0.7698414 0.7774452 0.0000000
> m2
          [,1]       [,2]      [,3] [,4]      [,5]
[1,] 0.0000000 0.89838968 0.2059746    0 0.9347052
[2,] 0.3721239 0.00000000 0.1765568    0 0.2121425
[3,] 0.0000000 0.00000000 0.0000000    0 0.0000000
[4,] 0.9082078 0.62911404 0.3841037    0 0.1255551
[5,] 0.2016819 0.06178627 0.7698414    0 0.0000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...