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() (3) | 2015.07.11 |
R Indexing (인덱싱), R 데이터 선택 (14) | 2015.07.09 |
R 데이터 구조 (Data Structure in R) : scala, vector, factor, matrix, array, dataframe, list (15) | 2015.07.09 |
R 객체 입력 방법 및 몇가지 Tips (8) | 2015.07.07 |
R 작업공간 설정 및 저장 (4) | 2015.07.06 |
댓글을 달아 주세요
좋은 글 감사합니다.
중간에 따라서 해보다가 잘못된 것 같은 부분을 찾았는데요
데이터프레임에서
d3[1,] 결과물이 벡터라고 하셨는데
class(d3[1,]) 해보면 data.frame이라고 나옵니다.
d3[[1]] 값도 numeric(즉, 벡터)으로 나오구요..
kjh 님, 지적해주신대로
class(d3[1,]) => data.frame 출력
으로 수정하였습니다.
댓글 감사합니다. ^^b
비밀댓글입니다
융융님, 도움이 되었다니 기쁘네요 ^^
비밀댓글입니다
객체명 바로 써주시면 됩니다
행렬만들때 굳이 nrow 안적어도 되네요
안적어도 실행은 되지만 명확화, 가독성 위해 적어주는게 좋습니다
안녕하세요 R프로그램 검색하다가 좋은 블로그를 발견해서 댓글남깁니다.
혹시 제 개인블로그(네이버블로그)에 요약정리하면서 공부하고 싶어서 그러는데
혹시 출처를 밝히고 제 블로그에 글을 올려도 될까요?
이번 포스팅의 부분 인용 또는 요약 인용은 괜찮은데요, 혹시 블로그 전체를 쭉 훓으면서 인용하시려는 거라면 안됩니다.
포스팅으로 열심히 공부하고 있습니다!! 질문이 있는데요. 데이터 프레임에서 인덱싱 할때 데이터 프레임으로 나오고, 벡터로 나오는 경우에 어떤 차이점 때문에 그렇게 나오는 건가요??
암기해야 하는 부분인가요?
안녕하세요 망구님.
반갑습니다.
DataFrame Indexing 할 때 반환객체가 어떤 때는 DataFrame이고 어떤 때는 vector 인지는 그냥 왜우셔야 할거 같습니다.
어떤 때 vector로 반환되는지만 유심히 살펴보시면 편할거 같아요.
- df[ , j]
- df[i, j]
- df[[j]]
- df$var
의 형식으로 DataFrame에서 indexing 할 때 vector를 반환합니다.
이를 강제로 DataFrame으로 반환하고 싶으면
data.frame(df[ ,j]) 처럼 data.frame() 함수를 사용하면 됩니다.
아..인덱싱 정리도 완벽하십니다.
정말 너무 감사합니다.
제 R공부의 바이블입니다.
사랑합니다.
안녕하세요 박수환님. 도움이 되었다니 기쁘네요. 댓글 감사합니다.