# How to select entire matrix except certain rows and columns?

Use functions `row`

and `col`

together with logical operations. The following works because R's matrices are in column-first order.

```
mat <- matrix(seq.int(5*4), nrow = 5)
mat[ !(row(mat) %in% 2:4) | !(col(mat) %in% 2:3) ] <- 0
mat
# [,1] [,2] [,3] [,4]
#[1,] 0 0 0 0
#[2,] 0 7 12 0
#[3,] 0 8 13 0
#[4,] 0 9 14 0
#[5,] 0 0 0 0
```

Another option with `replace`

```
replace(mat * 0, as.matrix(expand.grid(2:4, 2:3)), mat[2:4, 2:3])
```

-output

```
# [,1] [,2] [,3] [,4]
#[1,] 0 0 0 0
#[2,] 0 7 12 0
#[3,] 0 8 13 0
#[4,] 0 9 14 0
#[5,] 0 0 0 0
```

### data

```
mat <- matrix(seq.int(5*4), nrow = 5)
```

Here is a two-step base R option

```
rs <- 2:4
cs <- 2:3
`<-`(mat[setdiff(seq(nrow(mat)), rs), ], 0)
`<-`(mat[, setdiff(seq(ncol(mat)), cs)], 0)
```

which gives

```
> mat
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 7 12 0
[3,] 0 8 13 0
[4,] 0 9 14 0
[5,] 0 0 0 0
```

**Data**

```
mat <- matrix(seq.int(5*4), nrow = 5)
```