在矩阵中设置一些等于零的值

时间:2014-02-04 13:11:09

标签: r

我在网格点有一个ID值的矩阵,我有一个包含其中一些ID的向量。我想编写一个函数,以便对于向量中包含的所有ID,矩阵中的相应ID设置为0.

例如:

ID <- matrix(c(2,3), nrow=2)

A <- matrix(c(0, 0, 2, 2, 0, 3,
        1, 0, 0, 0, 0, 0,
        0, 1, 0, 0, 0, 4,
        1, 0, 1, 0, 0, 4), nrow=4, byrow=TRUE)

我想转换矩阵A,以便2和3变为0。

我找到了一种方法,用&#34; if&#34;功能,设定条件:

a <- nrow(A)
b <- ncol(A)
vide <- array(NaN, dim=c(a,b))

for (i in c(1:a)) {for (j in c(1:b)) {
  if ( (A[i,j]==ID[1,1]) | (A[i,j]==ID[2,1]) ) {
    vide[i,j]==0} else {vide[i,j]=A[i,j]}
  }
}

vide[is.na(vide)] <- 0

但我想创建一个自动函数,它将对ID向量中包含的所有ID执行此操作,而不管行数。因为我将运行多年,ID矩阵不会总是具有相同的行数。有没有办法做到这一点?

我还尝试了另一种方法,让R在条件中写出条件,如果&#34;功能本身:

d <- nrow(ID)
Cond <- array(NaN, dim=c(d,1))

for (k in c(1:d)) {
  Cond[k,1]=paste("(A[i,j]==ID[",k,",1]) ", sep="")
}

Cond <- t(Cond)
Cond <- paste(Cond,collapse="| ")
Cond <- noquote(Cond)

for (i in c(1:a)) {for (j in c(1:b)) {
  if (Cond) {
    vide[i,j]==0
  } else {
    vide[i,j]=A[i,j]
  }
}

但问题是Cond是一个字符矩阵,我收到错误消息&#34;参数不能解释为逻辑&#34;。

我是R的初学者,所以也许有一种更简单的方法可以做我想做的事情?我尝试在互联网上搜索,但似乎从来没有找到适合我的情况。谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

这是怎么回事?诀窍是处理矩阵是一个向量。 R将动态处理第二个维度。我在下面执行的操作是查找来自A的{​​{1}}个元素的位置,并用零覆盖它们。

ID