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 [1] 1 > x[3] [1] 3 > x[c(3:7)] [1] 3 4 5 6 7 > x[c(3, 5, 7)] [1] 3 5 7 > 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 [,1] [,2] [,3] [1,] 1 5 9 [2,] 2 6 10 [3,] 3 7 11 [4,] 4 8 12 > > m1[ 4, 2 ] [1] 8 > m1[ 4, ] [1] 4 8 12 > m1[ ,2 ] [1] 5 6 7 8 > m1[ c(3,4), 2 ] [1] 7 8 |
(3) 배열(Array) Indexing
배열은 동일한 유형의 2차원 이상의 데이터 구조로서, 행*열이 있는 바구니를 층층이 쌓아 놓은 모양이라고 했었지요. 층이 있다보니 Indexing할 때도 대괄호 [i, j, k] 로서 [행, 열, 층] indexing 위치를 표시합니다.
> ## 1~24까지의 숫자를 가지고 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] [1] 24 > 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[1, ] cust_id last_name 1 1 Kim > d3[ ,2] [1] Kim Lee Choi Park Levels: Choi Kim Lee Park > d3[1,2] [1] Kim Levels: Choi Kim Lee Park > d3[1] cust_id 1 1 2 2 3 3 4 4 > d3["cust_id"] cust_id 1 1 2 2 3 3 4 4 > d3[[1]] [1] 1 2 3 4 > d3$cust_id [1] 1 2 3 4 > 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]] [,1] [,2] [1,] 1 2 [2,] 3 4 [3,] 5 6 > ## => 부연설명하자면, 일단 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 말고 다른 언어 쓰시는 분들은 좀 헷갈릴 수 있는데요, 주의하시기 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^
'R 분석과 프로그래밍 > R 데이터 전처리' 카테고리의 다른 글
R 데이터 객체, 분석 결과를 외부 파일로 저장 : write.table(), cat() (15) | 2015.07.12 |
---|---|
R 데이터 편집기 edit(), 외부 파일 데이터 불러오기 read.table() (5) | 2015.07.11 |
R 데이터 구조 (Data Structure in R) : scala, vector, factor, matrix, array, dataframe, list (19) | 2015.07.09 |
R 객체 입력 방법 및 몇가지 Tips (8) | 2015.07.07 |
R 작업공간 설정 및 저장 (4) | 2015.07.06 |