본문 바로가기
5. 자료구조/2) 행렬 | matrix()

R 행렬 인덱싱, 원소 추가/수정/제거

by makhimh 2020. 1. 30.
반응형

R 행렬 인덱싱, 원소 추가/수정/제거



1. 행렬의 인덱싱


행렬을 하나 정의합시다.


> m1=matrix(c(1,2,3,4,5,6),nrow=2)

> m1

     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6


인덱싱 원리는 벡터와 동일한데, 방향이 하나 추가된 것입니다. 행방향 index와 열방향 index가 있습니다. 아래와 같이 입력합니다. 


행렬이름[행방향 index, 열방향 index]


1) 단일 원소


위 행렬의 1행2열 원소에 접근해봅시다.


> m1[1,1]

[1] 1


1행 2열의 원소에 접근해봅시다. 


> m1[1,2]

[1] 3



2) 여러원소


벡터형태로 인덱스를 입력하면 됩니다. 1행의 2,3열의 원소에 접근해봅시다. 


> m1[1,c(2,3)]

[1] 3 5


아래와 같이 입력해도 됩니다. 


> m1[1,2:3]

[1] 3 5


1,2행의 3열의 원소에 접근해봅시다. 


> m1[c(1,2),3]

[1] 5 6


여기서 알아야할 중요한 특징이 있습니다. 행렬의 인덱싱 결과가 벡터형태일 때(행이 1개이거나, 열이 1개)는 class를 벡터로 반환해준다는 것입니다. R에서 벡터는 행벡터와 열벡터의 구분이 없습니다. 행벡터와 열벡터를 구분하려면 matrix라는 class가 살아있어야 합니다. 행렬의 인덱싱 후에도 matrix의 특징을 살리려면 아래와 같은 옵션을 입력해주면 됩니다. 


> m1[c(1,2),3,drop=F]

     [,1]

[1,]    5

[2,]    6


행과 열의 개수가 둘다 2개 이상이면, 그대로 행렬이 반환됩니다. 


> m1[c(1,2),c(2,3)]

     [,1] [,2]

[1,]    3    5

[2,]    4    6


행 전체 혹은 열 전체를 선택할때는 자리를 비워두면 됩니다. 


> m1[1,]

[1] 1 3 5


> m1[2,]

[1] 2 4 6


> m1[,1]

[1] 1 2



4) 논리연산자


인덱스 자리에 논리연산자를 넣어도 됩니다. FALSE에 해당되는 열 또는 행은 되지 않습니다. 


> m1[c(TRUE,FALSE),]

[1] 1 3 5




2. 행렬의 원소 추가/수정/제거


1) 추가


열을 추가하고 싶을 때는 cbind함수를, 행을 추가하고 싶을 때는 rbind 함수를 사용합니다. 위에서 정의한 행렬을 가져옵시다. 


> m1=matrix(c(1,2,3,4,5,6),nrow=2)

> m1

     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6


4열에 7,8을 추가해보겠습니다. 


> m2=cbind(m1,c(7,8))

> m2

     [,1] [,2] [,3] [,4]

[1,]    1    3    5    7

[2,]    2    4    6    8


3열에 10,20,30,40 을 추가해보겠습니다.


> m3=rbind(m2,c(10,20,30,40))

> m3

     [,1] [,2] [,3] [,4]

[1,]    1    3    5    7

[2,]    2    4    6    8

[3,]   10   20   30   40



2) 수정


인덱싱을 이용하여 수정합니다. 위에서 정의한 행렬을 가져옵시다. 


> m1=matrix(c(1,2,3,4,5,6),nrow=2)

> m1

     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6


2행 3열의 원소를 수정해봅시다. 


> m1[2,3]=8

> m1

     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    8


1열을 한번에 수정합시다. 


> m1[,1]=c(10,20)

> m1

     [,1] [,2] [,3]

[1,]   10    3    5

[2,]   20    4    8



3) 제거


제거하고 싶은 열, 또는 행을 제외한 나머지를 선택해주면 됩니다. 위에서 정의한 행렬을 가져옵시다. 


> m1=matrix(c(1,2,3,4,5,6),nrow=2)

> m1

     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6


3열을 제거해보겠습니다. 


> m2=m1[,c(1,2)]

> m2

     [,1] [,2]

[1,]   10    3

[2,]   20    4


음수 인덱스를 이용할 수도 있습니다. 제거하기 원하는 행 또는 열의 인덱스에 음수를 붙여주면 됩니다. 


> m=matrix(1:9,nrow=3)

> m

     [,1] [,2] [,3]

[1,]    1    4    7

[2,]    2    5    8

[3,]    3    6    9


위 행렬에서 1행을 제거해봅시다. 


> m[-1,]

     [,1] [,2] [,3]

[1,]    2    5    8

[2,]    3    6    9


위 행렬에서 1행이 제거된 2열에 접근해봅시다. 


> m[-1,2]

[1] 5 6


반응형

댓글