본문 바로가기

데이터와 AI/R 기초

[R기초-5] Matrix 및 Data Frame의 연산 및 함수

반응형

앞서 얘기했던 Matrix와 Data Frame을 다뤄볼 차례다.

방법은 간단하다. 여러 함수를 이용해 해당 데이터의 유형, 특징 등을 파악해보는 것이다.

사용하려는 데이터에 대해 우선 이해가 있어야 나중에 적절한 알고리즘을 적용할 수 있다.

 

역시나 서론은 짧게, 실습은 길게.


1. IRIS 데이터

   - 취급할 데이터에 대해 간략하게 알아보자

   - 참고로, IRIS 데이터가 '열 단위'로 정렬되어있어, 함수의 입력도 '열 단위'로 입력됨을 유념해야 한다.

      (만약, 행 단위로 정렬되어있다면 행 단위의 입력으로 바꿔야 한다.)

   - iris데이터는 R studio에 탑재된 데이터로 바로 이용해볼 수 있다.

   - head함수를 이용하면 데이터 맨 앞부분을 확인해볼 수 있다.

   - head를 통해 데이터를 살펴보면 아래와 같다.

   - 열 이름이 length와 width, species이므로 종에 따른 길이와 폭의 관계성을 알아볼 수 있는 데이터다.

      ※ 비록 데이터 분석을 이제 공부하는 단계라서 정확하지는 않을 수 있겠지만, 이런 컬럼명과 데이터를

         보고 데이터의 특성과 어떤 결과가 나올지 유추해보는 것이 도움이 된다고 생각한다.

 

2. Data Frame의 구조와 유형을 살펴보는 함수

   - 설명이 필요없다. 아래 예시를 보자.

dim(iris)            # 행과 열의 수 보이기. iris데이터는 '150  5' 가 나온다
nrow(iris)          # 행의 수 출력. 150이 나온다
ncol(iris)           # 열의 수 출력. 5가 나온다
names(iris)        # 열의 이름을 출력한다. Sepal.length~(생략)~ 등 이름이 나온다
haed(iris)          # 위 함수의 내용을 한번에 알 수 있다. 단, 열이 엄청 많은 데이터로 테스트해보지 않아서
                      # 그런 데이터는 어떻게 출력될지 모르겠다.
tail(iris)             # haed가 데이터 앞쪽을 보여줬다면, tail은 데이터 뒷쪽을 보여준다.
str(iris)             # str은 structure의 줄임말로, 데이터의 구조를 보여준다.(아래 그림 참고)

unique(iris[,"Species"] # 아래 구문과 동일한 구문이다. 단, 해당 열의 '이름'을 넣어줬을 뿐이다.
unique(iris[,5])   # 해당 데이터의 중복을 제거한 데이터를 보여줌. 주로 특정 '열'을 집어 넣는다.
                     # 특정 '열'을 집어넣는 이유는 중복제거를 할 때 여러 기준의 데이터를 제거하지 않고,
                     # 동일 기준(length, width 등)의 데이터 내에서 중복을 제거하는 것이 의미있기 때문이다.
table(iris[,5]      # 특정 열에 동일한 데이터들끼리의 개수를 카운트 한다. 아래 예시를 보자

 

3. Data Frame의 연산

   - 말로 설명하는 것보다 예시를 보는 것이 낫다.

colSums(iris[,-5])      # 5번째 열을 제외하고 1,2,3,4번째 열의 합계를 출력한다.
                           # 참고로 인풋값으로는 숫자(numeric)만 들어가야 하기에 5번째 열을 지웠다.
colMeans(iris[,-5])    # Mean이 평균이므로 각 열의 평균값이 출력된다.
rowSums(iris[,-5])     # 중요한 점은 행의 연산을 하더라도 인풋값은 변함 없다는 것이다.
                           # 즉, 연산이 불가능한 행이나, 열은 제외해야 한다. 참고로 출력값은 아래와 같이 나온다.
                           # 데이터의 맨 앞의 숫자가 시작 데이터의 행번호를 출력한다. 즉, 10.2는 1행, 9.5는 2행,~
                           # 14행은 8.5가 된다. 그럼 맨 끝의 9.8은? 세보면 26행이다.

rowMeans(iris[,-5])   # 행별 평균값이 출력된다.

 

4. 조건에 맞는 표본 추출

   - IRIS는 열단위로 정렬되어 있으므로, 추출은 행단위로 이뤄진다.

   - 주의할점은 subset은 디폴트로 Data Frame을 입력받도록 되어있다. 따라서, Matrix를 입력하는 경우에는

     subset(대상 매트릭스, 추출 조건, drop=FALSE) 형태로 입력해야 한다.

   - help(subset)을 통해 왜 drop이 추가됐는지 개별적으로 확인해보자.

a <- subset(iris, Species=="setosa")   
          # iris테이블에서 Species가 setosa인 행을 추출. setosa 표본 50개가 저장된다.
a <- subset(iris, Sepal.Length<5.0 & Sepal.Width>3.0)
         # Length가 5.0보다 작고 Width가 3.0보다 큰 표본을 추출한다. 표본 13개가 저장된다.

 

5. Matrix의 연산

   - 주로, Data Frame을 이용하게 되겠지만 Matrix의 연산도 기본적으로 알아두자

a <- matrix(1:20,4,5)    # 앞선 Matrix소개글에서는 'nrow=', 'ncol='을 붙였지만 사실 안붙여도 된다.
b <- matrix(21:40,4,5)  # 'byrow=TRUE'가 설정되지 않았으니 디폴트로 열 우선으로 채워진다.
a+b; a-b; a*b             # 같은 위치의 원소끼리 연산이 된다.(행렬의 연산 아님 주의)
a%*%b;                    # 행렬곱셈 결과가 출력됨
a*3; b-5;                   # matrix의 각 원소에 정수(*3, -5)에 해당하는 연산을 수행

 

6. 데이터 타입의 확인

   - 그냥 얼핏보면 Matrix와 Data Frame은 형태가 동일해 보이지만 행번호에 대괄호가 있고 없고의 차이가 있다.

 

[예시] Matrix

[예시] Data Frame

   - 하지만, 우리는 멋드러지게 함수로 확인을 해보도록하자.

is.matrix(iris)          # matrix가 맞으면 TRUE, 틀리면 FALSE를 출력한다.
is.data.frame(a)      # data frame이 맞으면 TRUE, 틀리면 FALSE를 출력한다.
is.vector(벡터)        # 함수명만 보고도 알겠지만, 벡터인지 여부를 확인하는 함수이다.
class(iris)              # iris가 무엇인지 "matrix" or "data.frame"으로 출력된다.
                         # 참고로 숫자 원소가 들어간 일반 벡터는 "numeric", 문자가 들어간 벡터는 "character"로 출력

 

7. Matrix ↔ Data Frame간 변환

   - 함수를 이용하다보면 각 데이터 타입별로 이용 가능한 함수가 존재한다.

   - 이럴때는 변환함수를 이용해보도록 하자.

class(iris)                           #iris는 당연히 Data Frame이다.
e <- as.matrix(iris[,1:4])         #1:4열만 Matrix로 변환하라는 뜻이다.
class(e)                             #iris가 변환되었기에 e는 "matrix"로 출력된다.
e <- data.frame(e)               #e를 Data Frame으로 변환한다.
class(e)                             #당연하게도, Data Frame으로 출력된다.

 

이상으로 데이터 Matrix 및 Data Frame에 관한 연산을 마친다.

사실 이것보다 더 많지만, 마냥 함수만 배우는 것 보다 실제 분석을 하면서

함수를 사용하는 것이 효과적이기 때문에, 그때 그때 정의를 찾아보면서 실습해보도록 하겠다.

 

반응형