R中的循环和替代方案

wis*_*ool 3 loops r matrix

我有一个矩阵(1051*1051),其对角线上有0zeros,其他地方的值大于0zero.目标是有条件地重新分配矩阵中的一些值.例如,我想要实现的标准是:如果任何元素大于400,那么该行/列元素将被赋予0zero值.

这就是我现在的代码设置方式:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

DIST是原始矩阵(1051*1051).

DIS是DIST的副本并进行编辑.

我的问题:有没有其他方法可以做到这一点?更快的方法?

我已经读过应该避免R中的循环.如果有人有更有效的方式请分享.

谢谢.

Ari*_*man 9

只需使用[]赋值:

DIST[DIST>400] <- 0
Run Code Online (Sandbox Code Playgroud)

看看它?'['是如何工作的.关键是DIST>400产生一个长度的逻辑向量length(DIST)(DIST中的元素数量),如果元素> 400,则为TRUE,否则为FALSE.然后使用该向量对矩阵进行子集化,并且仅将所选元素分配给.


djh*_*rio 6

尝试

DIS[DIST > d1] <- 0
Run Code Online (Sandbox Code Playgroud)

完整示例:

n <- 10
d1 <- 400
DIST <- matrix(as.integer(runif(n^2)*1e4), n, n)
DIS <- DIST
DIS[DIST > d1] <- 0
Run Code Online (Sandbox Code Playgroud)