john
john

Reputation: 35

Producing equal results for column entries which are the same

I have the piece of code below. What i want is alter the code such that when the column entries for mat are the same, i get the same result in their respective positions in summation without it performing the fit operation?

So instead of getting

             1    3    5    1    7    1
             2    4    6    2    8    2  
             3    9   12    5   16    4  

I want

           1    3    5    1    7    1
           2    4    6    2    8    2
           3    9   12    3   16    3
   set.seed(123)
   fit = function(A){
       x = A[1]
       y = A[2]
       z = sum(sample((x+y),2))
       return(z)
  }
  mat= matrix(c(1,2,3,4,5,6,1,2,7,8,1,2),nrow=2,ncol=6)
  summation=apply(mat, 2, FUN = 'fit')
  newmat=rbind(mat,summation)
  newmat 

Upvotes: 0

Views: 29

Answers (1)

Ronak Shah
Ronak Shah

Reputation: 388862

You can find out columns that are duplicates and replace the corresponding summation value with the first value of summation so that you get the same value.

fit = function(A){
  x = A[1]
  y = A[2]
  z = sum(sample((x+y),2))
  return(z)
}
mat= matrix(c(1,2,3,4,5,6,1,2,7,8,1,2),nrow=2,ncol=6)
summation=apply(mat, 2, FUN = 'fit')
vals <- apply(mat, 2, paste0, collapse = '-')
summation <- ave(summation, match(vals, unique(vals)), FUN = function(x) x[1])
newmat=rbind(mat,summation)
newmat

To pass only unique columns to fit function we can do :

fit = function(A){
  x = A[1]
  y = A[2]
  z = sum(sample((x+y),2))
  return(z)
}
mat= matrix(c(1,2,3,4,5,6,1,2,7,8,1,2),nrow=2,ncol=6)
vals <- apply(mat, 2, paste0, collapse = '-')
summation <- apply(mat[, !duplicated(vals)], 2, fit)
summation <- summation[match(vals, unique(vals))]
newmat=rbind(mat,summation)
newmat

Upvotes: 1

Related Questions