R 데이터 구조 (Data Structure in R) : scala, vector, factor, matrix, array, dataframe, list
R 분석과 프로그래밍/R 데이터 전처리 2015. 7. 9. 00:08SAS나 SPSS를 사용하다가 R을 처음 배우는 사용자라면 R에서 7개로 나누는 데이터 구조에 대해서 '이걸 왜 배우지? SAS나 SPSS는 이런거 모르고도 아무 문제 없이 데이터 처리, 분석 다 했었는데...'라는 의문과 함께, 'R 이거 배우기 어렵네...'라고 푸념할 수도 있겠습니다. 제가 그랬거든요. (SAS나 SPSS에서 주로 사용했던 데이터 구조가 R의 데이터 구조 중에서는 '데이터 프레임' or '행렬'이라고 하는 구조라고 생각하시면 됩니다. 전부다는 아니고 많은 경우....)
R의 데이터 구조별 특성에 대해서 정확하게 이해하지 않으면 나중에 데이터 처리, 분석 넘어갔을 때 자꾸 헷갈리고, 에러가 났을 때 에러 메시지가 무슨 의미인지 이해를 못할 가능성이 높습니다. 데이터 구조에 따라서 분석기법이 달라지게 되거든요. 라틴댄스로 치자면 빨리 '패턴' 배워서 멋지게 파트너와 춤추고 싶은데 선생님은 한달이고 두달이고 '스탭'만 연습시키는데요, 어찌보면 따분하고 답답한 '스탭' 기본기가 R로 치면 데이터 구조라고 생각하시면 되겠습니다. R의 기본이 되는 중요한 개념이므로, 그리고 나중에 이게 제대로 이해가 되고 R이 손에 익었다 싶을 때 다시 되돌아 보면 R에서 데이터 구조를 이렇게 나누어서 분석 기법을 달리 하는 것이 R의 차별화된 장점이자 특징이겠구나 하고 느끼게 되는 시점이 올겁니다.
R 데이터 구조는 (1) 스칼라, (2) 벡터, (3) 요인, (4) 행렬, (5) 배열, (6) 데이터프레임, (7) 리스트의 7개로 나눌 수 있습니다. 하나씩 설명을 할텐데요, 처음에 잘 이해가 안가도 자꾸 R 사용하면서 다시 이번 포스팅 다시 돌아와서 한번씩 복습하시면 이해되는 날이 올거예요. (제가 Coursera로 강의 듣는데 R 데이터 구조라면서 강사가 막 영어로 뭐라 뭐라 하는데.... 뭔 소리인지 이해도 안되고, 이걸 왜 배우나 싶고, 짜증도 나고, 좌절도 되고...암튼 그랬는데요, 어느 순간 지나서 보니깐 다 이해를 하고 있더라고요. 한번 보고서 이해 안된다고 좌절하지 마시라는 뜻에서 자꾸 같은 소리 하고 있습니다. ^^;;;)
1. 스칼라 (Scala) |
구성인자가 하나인 벡터를 말합니다.
> # 스칼라 (Scala) : 구성인자가 1개인 벡터 > s1 <- c(1) > s2 <- c("Kim") |
2. 벡터 (Vector) |
벡터는 동일한 유형의 데이터가 구성인자가 1개 이상이면서 1차원으로 구성되어 있는 데이터 구조를 말합니다.
(벡터 중에서 구성인자가 1개인 것을 '스칼라'라고 합니다)
> # Vector > v1 <- c(1, 2, 3) # 숫자형 벡터 > v2 <- c("Kim", "Lee", "Choi") # 문자형 벡터 > v3 <- c(TRUE, TRUE, FALSE) # 논리형 벡터 |
3. 요인 (Factor) |
범주형(명목형 또는 순서형)의 데이터 구조를 요인(Factor)라고 합니다. 통계 분석 할 때 소위 '~~별' 분석을 할 때 쓰는게 요인이므로 굉장히 많이 사용됩니다. 나중에 분석을 하다보면 (1) '요인'으로 데이터를 변환해야 하는 경우도 생기고, (2) 반대로 '요인'이 아니어야 하는데 '요인'으로 데이터가 입력이 되어있어서 에러가 발생하는 경우도 생기곤 합니다. '요인'이 뭔지, 뭐에 쓰는 것인지 모르면 두 가지 경우 상황 파악을 못해서 곤혹스럽겠지요?
요인이 가질 수 있는 값들을 '수준(level)'이라고 합니다. RDBMS에서의 '코드값'이라고 이해하면 되겠습니다. 수준(level)은 명목형은 상관없지만, 순서형의 경우 순서(order)를 부여할 수 있습니다. 분석 결과가 순서대로 범주화 되서 나와야 보기에 좋겠지요?
> # (1) 문자형 데이터를 그냥 입력하면, 따옴표가 있는 문자형 벡터가 생성 > f1 <- c("Middle", "Low", "High") > f1 [1] "Middle" "Low" "High" > > # (2) factor()함수를 이용해서 문자형 벡터를 요인(factor)로 변환 > # 단, 순서를 지정 안해주면 알파벳 순서로 수준(level)이 자동으로 지정됨 > f2 <- factor(f1) > f2 [1] Middle Low High Levels: High Low Middle > > # (3) 수준(level)에 순서를 부여하려면 'order=TRUE' 옵션 설정, level=c("") 에 순서대로 입력 > f3 <- factor(f2, order = TRUE, level = c("Low", "Middle", "High")) > f3 [1] Middle Low High Levels: Low < Middle < High |
4. 행렬 (Matrix) |
행렬은 동일한 유형의 2차원 데이터 구조를 말합니다. (쉽게 말해 m x n 형태의 표 형태의 데이터)
참고로, 벡터는 동일한 유형의 1차원 데이터 구조라고 했지요. (쉽게 말해, 가로로 늘어선 한 줄 데이터)
행렬은 matrix() 라는 함수를 사용합니다.
최적화(optimization) 할 때 제약조건을 행렬로 입력합니다. 공학에서 행렬 많이 사용합니다.
> # 1~12까지의 숫자를 행(row)의 수가 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 > > # 1~12까지의 숫자를 행(row)의 수가 4개이고 행렬로 만드는데, 행 기준(byrow=TRUE)으로 채워나가라 > m2 <- matrix(1:12, nrow=4, byrow=TRUE) > m2 [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 [4,] 10 11 12 > |
5. 배열 (Array) |
배열(Array)은 동일한 유형의 데이터가 2차원 이상으로 구성된 구조를 말합니다.
참고로, 행렬은 동일한 유형의 2차원 데이터 구조라고 했지요. 따라서 배열은 쉽게 말해 행렬이라는 방을 층 층이 쌓아놓은 아파트라고 생각하시면 되겠습니다.
> # 1~24까지의 숫자를 '2 x 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 > # 1~24까지의 숫자를 '3 x 4' 행렬로 해서 '2층'짜리의 데이터 구조를 만들어라 > a2 <- array(1:23, c(3,4,2)) > a2 , , 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 1 |
6. 데이터 프레임 (Data Frame) |
데이터 프레임은 데이터 유형에 상관없이 2차원 형태의 데이터 구조를 말합니다.
참고로, 행렬은 동일한 유형의 데이터가 2차원 형태로 구성되었다고 했지요.
통계, 마이닝 분석할 때 데이터 프레임을 주로 사용합니다.
> # 다른 유형의 벡터 생성 > d1 <- c(1,2,3,4) > d2 <- c("Kim", "Lee", "Choi", "Park") > > # 데이터 프레임으로 묶기 : data.frame() 함수 사용 > 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 |
7. 리스트 (List) |
리스트는 벡터, 행렬, 배열, 데이터 프레임 등과 같은 서로 다른 구조의 데이터를 모두 묶은 객체를 말합니다.
참고로, 리스트 말고 나머지들은 서로 다른 구조의 데이터 끼리는 묶어 놓지 않았고 따로 따로 였지요.
R에서는 통계 분석 결과가 보통 리스트 구조로 제시되고, 필요로 하는 통계량이 있으면 indexing해서 뽑아서 쓰기도 합니다.
서로 다른 구조의 다수의 데이터 객체를 개별로 따로 따로 관리하는 것보다는, 이것들을 리스트라는 한 바구니에 가지런히 정리해서 모아놓으면 관리하기에 편하겠지요?
> # Vector(L1), Matrix(L2), Array(L3), Data Frame(L4)를 만들어서, 하나의 List(L5)로 묶어라 > 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")) # Data Frame > L5 <- list(L1, L2, L3, L4) # List > > # [[1]]는 Vector(L1), [[2]]는 Matrix(L2), [[3]]는 Array(L3), [[4]]는 Data Frame(L4)가 묶인 것임 > 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
|
지금까지 살펴본 R의 데이터 구조를 도식화하면 아래와 같습니다. 뭐가 뭐의 부분집한인지, 각 데이터 구조를 구분하는 기준은 무엇인지 유심히 다시 한번 살펴보기 정리해보면 좋겠습니다.
[ R 데이터 구조 (Data Structure in R) ]
많은 도움 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^
'R 분석과 프로그래밍 > R 데이터 전처리' 카테고리의 다른 글
R 데이터 편집기 edit(), 외부 파일 데이터 불러오기 read.table() (5) | 2015.07.11 |
---|---|
R Indexing (인덱싱), R 데이터 선택 (23) | 2015.07.09 |
R 객체 입력 방법 및 몇가지 Tips (8) | 2015.07.07 |
R 작업공간 설정 및 저장 (4) | 2015.07.06 |
[R] RStudio 에서 한글이 깨질 때 (15) | 2015.07.04 |