and in advance for your help!
This question is related to the one I posted before , but I think it deserves its own message, because it is a separate challenge.
Last time I asked about a random selection of values from a matrix after adding a vector. In this example, the matrix and the vector were binary. Now I would like to change the values in the weighted matrix after adding the weighted vector. Here is a sample code to play.
require(gamlss.dist) mat1<-matrix(c(0,0,0,0,1,0, 0,10,0,0,0,5, 0,0,0,0,1,0, 0,0,3,0,0,0, 0,0,0,0,3,0, 0,0,2,0,0,0, 2,1,0,1,0,1, 0,0,0,0,37,0, 0,0,0,2,0,0, 0,0,0,0,0,1, 1,0,0,0,0,0, 0,1,1,0,0,0), byrow=T, ncol=6, nrow=12) vec1<-c(0,0,0,1,1,1) ones <- which(vec1 == 1L) temp=rZIP(sum(vec1))
The values in the vector are selected from a distributed one with a zero distribution (thanks to this question ). When I bind a vector to a matrix, I want to randomly select a nonzero value from the same column and subtract the value of the vector from it. I see an additional complication arising if the vector value is greater than the randomly selected value in the same column. In that case, he would simply set this value to zero.
Here is some modified code from an earlier question that does not work for this problem, but may be useful.
foo <- function(mat, vec) { nr <- nrow(mat) nc <- ncol(mat) cols <- which(vec != 0)
Any ideas? Thanks again for all the fantastic help!
EDIT:
Thanks to the help of bnaul below, I am much closer to the answer, but we faced the same problem that we encountered the last time. The sample function does not work properly in columns where there is only one nonzero value. I fixed this using the Gavin Simpson if else instruction (which was the solution in the previous case). I adjusted the matrix to have columns with only one nonzero value.
mat1<-matrix(c(0,0,0,0,1,0, 0,0,0,0,0,5, 0,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,3,0, 0,0,2,0,0,0, 2,1,0,1,0,1, 0,0,0,0,37,0, 0,0,0,2,0,0, 0,0,0,0,0,1, 1,0,0,0,0,0, 0,0,0,0,0,0), byrow=T, ncol=6, nrow=12) vec1<-c(0,1,0,0,1,1) ones <- which(vec1 == 1L) temp=rZIP(sum(vec1)) vec1[ones]<-temp mat2 = rbind(mat1, vec1) apply(mat2, 2, function(col) {
Thanks again!