Manuel R
Manuel R

Reputation: 4145

Replace one column in matrix by > 1 columns

How to easily replace a (N x 1) vector/column of a (N x M) matrix by a (N x K) matrix such that the result is a (N x (M - 1 + K)) matrix?

Example:

a <- matrix(c(1, 3, 4, 5), nrow = 2) # (2 x 2)
b <- matrix(c(1, 3, 5, 6, 7, 7), nrow = 2) # (2 x 3)

I now want to do something like this:

a[, 1, drop = FALSE] <- b # Error

which R does not like.

All I could think of is a two-step approach: attach b to a and subsequently delete column 1. Problem: it mixes the order the columns appear.

Basically, I want to have a simple drop in replacement. I am sure it is possible somehow.

Upvotes: 0

Views: 348

Answers (1)

dww
dww

Reputation: 31452

You can use cbind:

cbind(b, a[,-1])
#     [,1] [,2] [,3] [,4]
#[1,]    1    5    7    4
#[2,]    3    6    7    5

If you need to insert in the middle of a large matrix (say, at column N), rather than one end you can use,

cbind(a[, 1:(N-1)], b, a[, (N+1):NCOL(a)])

For a generalized version that works wherever the insert is (start, middle or end) we can use

a <- matrix(1:10, nrow = 2) 
b <- matrix(c(100, 100, 100, 100, 100, 100), nrow = 2) 

N <- 6 # where we want to insert
NMAX <- NCOL(a) # the largest column where we can insert

cbind(a[, 0:(N-1)], b, {if(N<NMAX) a[,(N+1):NMAX] else NULL})

Upvotes: 2

Related Questions