BNS1993 BNS1993 - 1 month ago 6
R Question

replacing values in 0/1 filled matrix for it's corresponding columnnames when the row has more than one 1-value in R

I have a matrix like this one.

`
a b c d
[1,] 1 0 0 0
[2,] 1 0 0 0
[3,] 1 0 0 0
[4,] 1 0 0 0
[5,] 1 0 0 0
[6,] 1 0 0 0
[7,] 1 0 0 0
[8,] 1 1 0 0
[9,] 1 1 0 0
[10,] 1 1 0 0
[11,] 0 1 0 1
[12,] 1 1 0 1
[13,] 1 1 0 1
[14,] 1 1 0 1
[15,] 0 1 0 1
[16,] 0 1 0 1
[17,] 0 1 0 1
[18,] 0 1 0 1
[19,] 0 1 1 0
[20,] 0 1 0 0
[21,] 1 1 1 1
[22,] 1 1 1 1
[23,] 1 0 1 1
[24,] 1 0 0 1
[25,] 1 0 0 1
[26,] 1 0 1 1
[27,] 1 0 1 0
[28,] 0 0 1 0
[29,] 0 0 1 0
[30,] 0 0 1 1`


code for reproducing:

`
mat1 <- as.matrix(cbind(c(rep(1,10),0,1,1,1,0,rep(0,5),rep(1,7),0,0,0),c(rep(0,7),rep(1,15),rep(0,8)),c(rep(0,18),1,0,1,1,1,0,0,rep(1,5)),c(rep(0,10),rep(1,6),1,1,0,0,rep(1,6),0,0,0,1)))


colnames(mat1) <- c("a", "b", "c", "d")


What I want is to check in each row if there are more then one values of 1. Like the first row for example row 8:

`
a b c d
[8,] 1 1 0 0`


Then I want to replace these 1 values for their corresponding column name.

Like this:

'
a b c d
[8,] a b 0 0`
'


I want to apply this to all 1 values in rows where there is more then one 1 value, while keeping the matrix structure.

Selecting the rows with more then one 1 value was not that hard, selecting the corresponding column names was also manageable, but then replacing them, I could not manage.
This is what I have managed to do

`
apply(mat1,1, function(x) {
#select rows with more then one 1
if(sum(x) > 1) {
#for every row with more than one 1; check if the value is 1
for (i in 1:4) {
if (x[i]==1) {
#this seems to print every column name I need
print(colnames(mat1)[i])
#replacing should happen here I ques, but I can't get the location in the matrix.

}
}
}
})
`


Would anyone be so kind to help me with this problem? Also, a better way than this double loop is welcome of course, but not necessary for my problem.

Answer

You can try this:

col_n <- colnames(mat1)
res <- apply(mat1,1, function(x) {
  #select rows with more then one 1
  if(sum(x) > 1) {
    x[x == 1] <- col_n[x == 1]
  }
  return(x)
})

res <- t(res)