user3738650
user3738650

Reputation:

Changing multiple values in matrix using a pattern

My input matrix

set.seed(123)
m1 <- matrix(sample(letters, 50, replace=TRUE), 5) 

Here, I wanted to replace letters with "A", "B", "C", "D" by following a pattern of 4 letter difference. i.e. "A" should replace letters "a", "e", "i", "m", "q", "u", "y", "B" replace "b", "f", "j",....etc.

I tried

replace(m1, c("a","e","i","m","q", "u", "y"), "A")

which is not correct.

Upvotes: 2

Views: 55

Answers (2)

Thomas
Thomas

Reputation: 44555

Use a simple for-loop:

for(i in 1:4) m1[m1 %in% letters[seq(i,26,by=4)]] <- LETTERS[i]

> m1
 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "D"  "B"  "A"  "D"  "D"  "C"  "B"  "A"  "D"  "D"  
[2,] "A"  "B"  "D"  "C"  "C"  "C"  "D"  "D"  "C"  "C"  
[3,] "C"  "D"  "B"  "B"  "A"  "D"  "B"  "B"  "C"  "A"  
[4,] "C"  "C"  "C"  "A"  "B"  "D"  "A"  "A"  "B"  "C"  
[5,] "A"  "D"  "C"  "A"  "B"  "D"  "A"  "C"  "D"  "C"

Upvotes: 2

Matthew Plourde
Matthew Plourde

Reputation: 44614

Here's a way using modular arithmetic:

matrix(toupper(letters)[((match(m1, letters) - 1) %% 4) + 1], ncol=ncol(m1))

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] "D"  "B"  "A"  "D"  "D"  "C"  "B"  "A"  "D"  "D"  
# [2,] "A"  "B"  "D"  "C"  "C"  "C"  "D"  "D"  "C"  "C"  
# [3,] "C"  "D"  "B"  "B"  "A"  "D"  "B"  "B"  "C"  "A"  
# [4,] "C"  "C"  "C"  "A"  "B"  "D"  "A"  "A"  "B"  "C"  
# [5,] "A"  "D"  "C"  "A"  "B"  "D"  "A"  "C"  "D"  "C"

Upvotes: 3

Related Questions