顺序/递归地用矩阵替换矩阵中列的第一个数字元素,直到all = 0

时间:2016-09-11 08:20:14

标签: r recursion matrix

我想迭代地删除矩阵的所有列中的第一个数字元素,一次一次迭代,直到所有值都为0。即

matrix(nrow=3,ncol=2,Iteration1)
Iteration1=c(1,1,0,1,1,0)
Iteration2=c(0,1,0,0,1,0)
Iteration3=c(0,0,0,0,0,0)

以下函数基于前一篇文章,用于识别和替换第一个数字元素。如何将此结果循环回函数以删除下一个数字元素,并保留每次迭代的结果?

模拟数据

data<-rbinom(20, size=1, prob=0.5)
data<-c(data)
dat<-matrix(data,nrow = 5,ncol=4)
mat<-dat

#identify first element=1

fun1<-function(mat){
cols<-c(1,2,3,4)
rown <-apply(mat[,cols] , 2, function(x) which(x==1)[1])
mat[cbind(rown,cols )] <- c(0,0,0,0)
return(mat)}

fun1(mat)

1 个答案:

答案 0 :(得分:0)

这里有两个问题需要解决。第一个是,只要其中一列不包含任何非零值,您的fun1()就会失败。第二个是如何进行递归并存储中间结果。我将在下面解决它们。

改进fun1()

只要其中一列不包含任何非零值,您的fun1()就会抛出错误。原因是对于这些列,rown的值为NA,这会导致mat[cbind(rown,cols )]出错。以下版本的fun1()没有此问题(并且作为您的函数也更通用,因为它也适用于没有4列的矩阵):

fun1 <- function(mat) {
  rows <- apply(mat, 2, function(x) which(x==1)[1])
  idx <- cbind(rows[!is.na(rows)], which(!is.na(rows)))
  mat[idx] <- 0
  return (mat)
}

如何进行递归

您可以使用while循环执行递归。在每一步,结果矩阵都存储在一个列表中:

mat <- dat
mats <- list()
while (any(mat != 0)) {
  mat <- fun1(mat)
  mats <- append(mats, list(mat))
}

mats是四个矩阵的列表,其中第一个(mats[[1]])等于fun1(mat),最后一个(mats[[4]])仅包含零。< / p>