R에서 데이터의 일부분을 선택/선별하는 작업을 Indexing 한다고 합니다. 


R로 데이터 전처리, 분석을 하다보면 R Indexing을 부지기수로 사용하게 되니 R Indexing은 제대로 알고 넘어가야할 매우 중요한 부분입니다. 


특히, R에서는 벡터 Indexing 후 연산하는게 매우 큰 강점이고 유용한 기능이랍니다. 


R을 잘 몰랐을 때 남이 짜놓은 R 코드를 보면서 도무지 이해가 안되고 수수께끼 같았었는데요, 나중에 알고보니 Indexing을 사용한 것이었더라구요. Indexing, 모르면 어렵게 느껴져도 한번 알고 나면 참 쉬운 개념이고 파워풀한 기능이랍니다. 



 

 R Indexing (인덱싱), R 데이터 선택

 

Indexing은 대괄호 [ ] 를 사용합니다. 

바로 직전에 포스팅한 R 데이터 구조별로 Indexing 예를 차근차근 들어보도록 하겠습니다. 


(1) 벡터 (Vector) Indexing


벡터 Indexing 할 때 조건을 주는 방법이 한가지만 있는게 아니랍니다. 


> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

> ## 벡터 x의 첫번째 구성요소 Indexing
> x[1]

[1] 1
>
> ## 벡터 x의 세번째 구성요소 Indexing

> x[3]

[1] 3

> ## 벡터 x의 세번째~일곱번째 구성요소 Indexing

> x[c(3:7)]

[1] 3 4 5 6 7
>
> ## 벡터 x의 세번째, 다섯번째, 일곱번째 구성요소 Indexing

> x[c(3, 5, 7)]

[1] 3 5 7

> ## 벡터 x에서 TRUE 있는 위치의 구성요소 Indexing

> x[c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)]

[1] 1 2 3 



(2) 행렬(Matrix) Indexing


행렬 Indexing은 대괄호 [i, j] 를 사용합니다. (i번째 행, j 번째 열을 뜻함)


> ## 1~12 숫자로 4열짜리 행렬 생성
> m1 <- matrix(1:12, nrow=4)

> m1

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

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12


> ## m1 행렬에서 4번째 행, 2번째 열 구성요소 선택 (i, j indexing)

> m1[ 4, 2 ]

[1] 8

> ## m1 행렬에서 4번째 행 전체 구성요소 선택 (i indexing)

> m1[ 4, ]

[1]  4  8 12

> ## m1 행렬에서 2번째 열 전체 구성요소 선택 (j indexing)

> m1[ ,2 ]

[1] 5 6 7 8

> ## m1 행렬에서 3번째과 4번째 행의 2번째 열 구성요소 선택 (i, j indexing)

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

[1] 7 8 



(3) 배열(Array) Indexing


배열은 동일한 유형의 2차원 이상의 데이터 구조로서, 행*열이 있는 바구니를 층층이 쌓아 놓은 모양이라고 했었지요. 층이 있다보니 Indexing할 때도 대괄호 [i, j, k] 로서 [행, 열, 층] indexing 위치를 표시합니다. 


> ## 1~24까지의 숫자를 가지고 2행*3열짜리 행렬을 4개 층으로 만들기
> a1 <- array(1:24, c(2,3,4))

> a1

, , 1


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

[1,]    1    3    5

[2,]    2    4    6


, , 2


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

[1,]    7    9   11

[2,]    8   10   12


, , 3


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

[1,]   13   15   17

[2,]   14   16   18


, , 4


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

[1,]   19   21   23

[2,]   20   22   24


> ## a1 배열의 2번째 행, 3번째 열, 4번째 층에 있는 구성요소 선택 (i, j, k indexing)

> a1[2,3,4]

[1] 24

> ## a1 배열의 1번째와 2번째 행, 3번째 열, 4번째 층에 있는 구성요소들 선택 (i, j, k indexing)

> a1[c(1,2), 3, 4]

[1] 23 24



(4) 데이터 프레임(Data Frame) Indexing


대괄호 [i, j] 로 표시, [i번째 행, j번째 열] indexing해오라는 뜻입니다. 

통계 분석 시 데이터 프레임 구조를 가장 많이 사용하다고 했으므로 데이터 프레임 Indexing도 많이 사용하겠지요? 

대골호를 하나만 쓰느냐 ([]), 두개를 쓰느냐 ([[]])에 따라서 indexing후의 데이터 구조(벡터 또는 데이터 프레임)가 달라지므로 주의를 요합니다. 벡터 구조로 indexing할 때 'dataset이름$변수이름' 형식으로 '$'를 쓰기도 합니다. 아래 예제를 보면 이해가 쉬울 것입니다. 


> ## dataframe 생성

> d1 <- c(1,2,3,4)

> d2 <- c("Kim", "Lee", "Choi", "Park")

> d3 <- data.frame(cust_id = d1, last_name = d2)

> d3

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park


> ## d3 데이터 프레임에서 첫번째 행의 모든 구성요소를 선택 [i, ] => 데이터 프레임으로 출력됨

> d3[1, ]

  cust_id last_name

1       1       Kim

> ## d3 데이터 프레임에서 두번째 열의 모든 구성요소를 선택[ ,j] => 벡터로 출력됨

> d3[ ,2]

[1] Kim  Lee  Choi Park

Levels: Choi Kim Lee Park

> ## d3 데이터 프레임에서 첫번째 행, 두번째 열의 위치에 있는 구성요소 선택 [i,j] => 벡터로 출력됨

> d3[1,2]

[1] Kim

Levels: Choi Kim Lee Park

> ## d3 데이터 프레임에서 1번째 열(변수) 구성요소 선택 [j] => 데이터 프레임으로 출력됨

> d3[1]

  cust_id

1       1

2       2

3       3

4       4

> ## d3 데이터 프레임에서 "cust_id" 변수의 구성요소 선택 ["var_name"] => 데이터 프레임으로 출력됨

> d3["cust_id"]

  cust_id

1       1

2       2

3       3

4       4

> ## d3 데이터 프레임에서 1번째 열(변수) 구성요소 선택 [[j]] => 벡터로 출력됨

> d3[[1]]

[1] 1 2 3 4

> ## d3 데이터 프레임에서 "cust_id" 변수의 구성요소 선택 $ => 벡터로 출력됨

> d3$cust_id

[1] 1 2 3 4

> ## d3 데이터 프레임에서 3번째 & 4번째 행, 2번째 열의 구성요소 선택 [c(i,i), j] => 벡터로 출력됨

> d3[c(3,4),2]

[1] Choi Park

Levels: Choi Kim Lee Park

>  



(5) 리스트 (List) Indexing


리스트 Indexing은 겹대괄호 [[i]] 를 사용합니다. (i 번째 층을 선택)

통계 분석 결과가 리스트 데이터 구조로 많이 출력된다고 했는데요, 분석 결과 중에서 특정 통계량만 선택(indexing)해서 다른 분석의 input으로 넣는 경우에 indexing 이 유용하게 사용됩니다. 


> ## L1, L2, L3, L4 각 구조가 다른 4개의 객체로 L5라는 list (묶음 다발) 만들기

> L1 <- c(1, 2, 3, 4) # Vector

> L2 <- matrix(1:6, 3, byrow=TRUE) # Matrix

> L3 <- array(1:24, c(3,4,2)) # Array

> L4 <- data.frame(cust_id = c(1, 2, 3, 4), last_name = c("Kim", "Lee", "Choi", "Park")) # Dataframe

> L5 <- list(L1, L2, L3, L4) # List

> L5   # L5 리스트 출력

[[1]]

[1] 1 2 3 4


[[2]]

     [,1] [,2]

[1,]    1    2

[2,]    3    4

[3,]    5    6


[[3]]

, , 1


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

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12


, , 2


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

[1,]   13   16   19   22

[2,]   14   17   20   23

[3,]   15   18   21   24



[[4]]

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park



> ## L5 리스트의 2번째 구성요소(2번째 층) 선택 [[i]]

> L5[[2]]

     [,1] [,2]

[1,]    1    2

[2,]    3    4

[3,]    5    6

> ## L5 리스트의 2번째 구성요소(2번째 층)의 3번째 행, 1번째 열의 구성요소 선택 [[i]][j, k]

> ## => 부연설명하자면, 일단 L5[[2]] 로 2번째 층 객체 선택 후 => 여기서 다시 [3, 1]로 3번째 행, 1번째 열 구성요소 선택한다고 생각하면 되겠음

> L5[[2]][3,1]

[1] 5 


여기까지 차분히 읽어오셨다면 R Indexing 의 머나먼 길을 완주하신겁니다. R의 훌륭한 무기 하나 득템하신 것을 축하합니다! 

 

※ 주의

 

R의 색인(indexing)이 '1'부터 시작하는 반면에,

Java, C, C++, Python 은 순차 자료형의 색인이 '0'부터 시작합니다.

R 말고 다른 언어 쓰시는 분들은 좀 헷갈릴 수 있는데요, 주의하시기 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

728x90
반응형
Posted by Rfriend
,