我有一个矩阵(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中的循环.如果有人有更有效的方式请分享.
谢谢.
只需使用[]赋值:
DIST[DIST>400] <- 0
Run Code Online (Sandbox Code Playgroud)
看看它?'['是如何工作的.关键是DIST>400产生一个长度的逻辑向量length(DIST)(DIST中的元素数量),如果元素> 400,则为TRUE,否则为FALSE.然后使用该向量对矩阵进行子集化,并且仅将所选元素分配给.
尝试
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)