我想迭代地删除矩阵的所有列中的第一个数字元素,一次一次迭代,直到所有值都为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)
答案 0 :(得分:0)
这里有两个问题需要解决。第一个是,只要其中一列不包含任何非零值,您的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>